Oracle PL/SQL-markør: implisitt, eksplisitt, for sløyfe med eksempel

Hva er CURSOR i PL/SQL?

En markør er en peker til dette kontekstområdet. Oracle oppretter kontekstområde for å behandle en SQL-setning som inneholder all informasjon om setningen.

PL/SQL lar programmereren kontrollere kontekstområdet gjennom markøren. En markør holder radene som returneres av SQL-setningen. Settet med rader markøren holder, kalles aktivt sett. Disse markørene kan også navngis slik at de kan henvises fra et annet sted i koden.

Markøren er av to typer.

  • Implisitt markør
  • Eksplisitt markør

Implisitt markør

Når noen DML-operasjoner forekommer i databasen, opprettes en implisitt markør som holder de berørte radene i den aktuelle operasjonen. Disse markørene kan ikke navngis, og de kan derfor ikke kontrolleres eller henvises fra et annet sted i koden. Vi kan kun referere til den nyeste markøren gjennom markørattributtene.

Eksplisitt markør

Programmerere har lov til å lage et navngitt kontekstområde for å utføre sine DML-operasjoner for å få mer kontroll over det. Den eksplisitte markøren bør defineres i deklarasjonsdelen av PL/SQL-blokk, og den er opprettet for 'SELECT'-setningen som må brukes i koden.

Nedenfor er trinn som er involvert i arbeid med eksplisitte markører.

  • Deklarerer markøren Å erklære markøren betyr ganske enkelt å lage ett navngitt kontekstområde for 'SELECT'-setningen som er definert i deklarasjonsdelen. Navnet på dette kontekstområdet er det samme som markørnavnet.
  • ÅpningsmarkørÅpne markøren vil instruere PL / SQL for å tildele minnet for denne markøren. Det vil gjøre markøren klar til å hente postene.
  • Henter data fra markørenI denne prosessen blir 'SELECT'-setningen utført og radene som hentes lagres i det tildelte minnet. Disse kalles nå som aktive sett. Å hente data fra markøren er en aktivitet på rekordnivå som betyr at vi kan få tilgang til dataene på en post-for-post måte. Hver henting-setning vil hente ett aktivt sett og inneholder informasjonen til den aktuelle posten. Denne setningen er den samme som 'SELECT'-setningen som henter posten og tilordner variabelen i 'INTO'-leddet, men den vil ikke gi noen unntak.
  • Lukke markørenNår all posten er hentet nå, må vi lukke markøren slik at minnet som er allokert til dette kontekstområdet frigjøres.

syntax

DECLARE
CURSOR <cursor_name> IS <SELECT statement^>
<cursor_variable declaration>
BEGIN
OPEN <cursor_name>;
FETCH <cursor_name> INTO <cursor_variable>;
.
.
CLOSE <cursor_name>;
END;
  • I syntaksen ovenfor inneholder deklarasjonsdelen erklæringen til markøren og markørvariabelen som hentede data vil bli tildelt.
  • Markøren opprettes for 'SELECT'-setningen som er gitt i markørerklæringen.
  • I utførelsesdelen åpnes, hentes og lukkes den deklarerte markøren.

Markørattributter

Både den implisitte markøren og den eksplisitte markøren har visse attributter som kan nås. Disse attributtene gir mer informasjon om markøroperasjonene. Nedenfor er de forskjellige markørattributtene og deres bruk.

Markørattributt Tekniske beskrivelser
%FANT Den returnerer det boolske resultatet 'TRUE' hvis den siste henteoperasjonen hentet en post vellykket, ellers vil den returnere FALSE.
%IKKE FUNNET Dette fungerer motsatt av %FOUND det vil returnere 'TRUE' hvis den siste henteoperasjonen ikke kunne hente noen post.
%ISOPEN Den returnerer det boolske resultatet 'TRUE' hvis den gitte markøren allerede er åpnet, ellers returnerer den 'FALSE'
%ROWCOUNT Den returnerer den numeriske verdien. Den gir det faktiske antallet poster som ble påvirket av DML-aktiviteten.

Eksplisitt markøreksempel:

I dette eksemplet skal vi se hvordan du kan deklarere, åpne, hente og lukke den eksplisitte markøren.

Vi projiserer alle ansattes navn fra emp-tabellen ved hjelp av en markør. Vi vil også bruke markørattributt for å sette løkken til å hente all posten fra markøren.

Oracle PL/SQL-markør

DECLARE
CURSOR guru99_det IS SELECT emp_name FROM emp;
lv_emp_name emp.emp_name%type;

BEGIN
OPEN guru99_det;

LOOP
FETCH guru99_det INTO lv_emp_name;
IF guru99_det%NOTFOUND
THEN
EXIT;
END IF;
Dbms_output.put_line(‘Employee Fetched:‘||lv_emp_name);
END LOOP;
Dbms_output.put_line(‘Total rows fetched is‘||guru99_det%R0WCOUNT);
CLOSE guru99_det;
END:
/

Produksjon

Employee Fetched:BBB
Employee Fetched:XXX
Employee Fetched:YYY 
Total rows fetched is 3

Kode Forklaring

  • Kodelinje 2: Erklærer markøren guru99_det for setningen 'SELECT emp_name FROM emp'.
  • Kodelinje 3: Erklærer variabel lv_emp_name.
  • Kodelinje 5: Åpne markøren guru99_det.
  • Kodelinje 6: Setter Basic loop-setningen til å hente alle postene i 'emp'-tabellen.
  • Kodelinje 7: Henter guru99_det-dataene og tilordner verdien til lv_emp_name.
  • Kodelinje 9: Bruke markørattributtet '%NOTFOUND' for å finne om all posten i markøren er hentet. Hvis den hentes, vil den returnere 'TRUE' og kontrollen vil gå ut av loopen, ellers vil kontrollen fortsette å hente dataene fra markøren og skrive ut dataene.
  • Kodelinje 11: EXIT-betingelse for loop-setningen.
  • Kodelinje 12: Skriv ut det hentede medarbeidernavnet.
  • Kodelinje 14: Bruke markørattributtet '%ROWCOUNT' for å finne det totale antallet poster som ble påvirket/hentet i markøren.
  • Kodelinje 15: Etter å ha gått ut av sløyfen lukkes markøren og det tildelte minnet frigjøres.

FOR Loop Cursor statement

"FOR LOOP"-setningen kan brukes til å arbeide med markører. Vi kan gi markørnavnet i stedet for områdegrense i FOR loop-setningen slik at loopen vil fungere fra markørens første post til markørens siste post. Markørvariabelen, åpning av markør, henting og lukking av markøren vil gjøres implisitt av FOR-løkken.

syntax

DECLARE
CURSOR <cursor_name> IS <SELECT statement>;
BEGIN
  FOR I IN <cursor_name>
  LOOP
  .
  .
  END LOOP;
END;
  • I syntaksen ovenfor inneholder erklæringsdelen erklæringen til markøren.
  • Markøren opprettes for 'SELECT'-setningen som er gitt i markørerklæringen.
  • I utførelsesdelen er den erklærte markøren satt opp i FOR-løkken og loop-variabelen 'I' vil oppføre seg som markørvariabel i dette tilfellet.

Oracle Markør for sløyfeeksempel:
I dette eksemplet vil vi projisere alle ansattes navn fra emp-tabellen ved å bruke en cursor-FOR-løkke.

DECLARE
CURSOR guru99_det IS SELECT emp_name FROM emp; 
BEGIN
FOR lv_emp_name IN guru99_det
LOOP
Dbms_output.put_line(‘Employee Fetched:‘||lv_emp_name.emp_name);
END LOOP;
END;
/

Produksjon

Employee Fetched:BBB 
Employee Fetched:XXX
Employee Fetched:YYY

Kode Forklaring

  • Kodelinje 2: Erklærer markøren guru99_det for setningen 'SELECT emp_name FROM emp'.
  • Kodelinje 4: Konstruerer 'FOR'-løkken for markøren med loop-variabelen lv_emp_name.
  • Kodelinje 5: Skrive ut den ansattes navn i hver iterasjon av loopen.
  • Kodelinje 8: Gå ut av løkken

OBS: I Cursor-FOR loop kan ikke markørattributter brukes siden åpning, henting og lukking av markøren gjøres implisitt av FOR løkke.