Oracle PL/SQL-markør: Implicit, Eksplicit, Til Loop med Eksempel

Hvad er CURSOR i PL/SQL?

En markør er en pegepind til dette kontekstområde. Oracle opretter kontekstområde til behandling af en SQL-sætning, som indeholder al information om sætningen.

PL/SQL giver programmøren mulighed for at styre kontekstområdet gennem markøren. En markør holder de rækker, der returneres af SQL-sætningen. Det sæt af rækker, som markøren holder, kaldes aktivt sæt. Disse markører kan også navngives, så de kan henvises fra et andet sted i koden.

Markøren er af to typer.

  • Implicit markør
  • Eksplicit markør

Implicit markør

Når der forekommer DML-handlinger i databasen, oprettes en implicit markør, der holder de berørte rækker i den pågældende operation. Disse markører kan ikke navngives, og de kan derfor ikke kontrolleres eller henvises fra et andet sted i koden. Vi kan kun referere til den seneste markør gennem markørattributterne.

Eksplicit markør

Programmører har lov til at oprette et navngivet kontekstområde for at udføre deres DML-operationer for at få mere kontrol over det. Den eksplicitte markør skal defineres i deklarationsafsnittet i PL/SQL-blok, og den oprettes til 'SELECT'-sætningen, der skal bruges i koden.

Nedenfor er trin, der involverede i at arbejde med eksplicitte markører.

  • Erklærer markøren At erklære markøren betyder ganske enkelt at oprette et navngivet kontekstområde for 'SELECT'-sætningen, der er defineret i deklarationsdelen. Navnet på dette kontekstområde er det samme som markørens navn.
  • Åbner markørÅbning af markøren vil instruere PL / SQL for at allokere hukommelsen til denne markør. Det vil gøre markøren klar til at hente posterne.
  • Henter data fra markørenI denne proces udføres 'SELECT'-sætningen, og de hentede rækker gemmes i den allokerede hukommelse. Disse kaldes nu som aktive sæt. Hentning af data fra markøren er en aktivitet på rekordniveau, der betyder, at vi kan få adgang til dataene på en rekord-for-post måde. Hver fetch-sætning henter et aktivt sæt og indeholder oplysningerne om den pågældende post. Denne sætning er den samme som 'SELECT'-sætning, der henter posten og tildeler variablen i 'INTO'-sætningen, men den vil ikke give nogen undtagelser.
  • Lukning af markørenNår hele posten er hentet nu, skal vi lukke markøren, så den hukommelse, der er allokeret til dette kontekstområde, frigives.

Syntaks

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 ovenstående syntaks indeholder erklæringsdelen erklæringen af ​​markøren og den markørvariabel, hvori de hentede data vil blive tildelt.
  • Cursoren oprettes til 'SELECT'-sætningen, der er angivet i markørerklæringen.
  • I udførelsesdelen åbnes, hentes og lukkes den erklærede markør.

Markørattributter

Både den implicitte markør og den eksplicitte markør har visse attributter, der kan tilgås. Disse attributter giver mere information om markørhandlingerne. Nedenfor er de forskellige markørattributter og deres brug.

Markørattribut Produktbeskrivelse
% FUNDET Det returnerer det boolske resultat 'TRUE', hvis den seneste hentning har hentet en post med succes, ellers returnerer den FALSE.
%IKKE FUNDET Dette virker modsat af %FOUND det vil returnere 'TRUE', hvis den seneste hentning ikke kunne hente nogen post.
%ER ÅBEN Den returnerer det boolske resultat 'TRUE', hvis den givne markør allerede er åbnet, ellers returnerer den 'FALSE'
% ROWCOUNT Det returnerer den numeriske værdi. Det viser det faktiske antal poster, der blev påvirket af DML-aktiviteten.

Eksplicit markøreksempel:

I dette eksempel skal vi se, hvordan man deklarerer, åbner, henter og lukker den eksplicitte markør.

Vi projicerer alle medarbejderens navn fra emp table ved hjælp af en markør. Vi vil også bruge cursor attribut til at indstille løkken til at hente hele 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:
/

Produktion

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 sætningen 'SELECT emp_name FROM emp'.
  • Kodelinje 3: Erklærer variabel lv_emp_name.
  • Kodelinje 5: Åbning af markøren guru99_det.
  • Kodelinje 6: Indstilling af Basic loop-sætningen til at hente alle posterne i 'emp'-tabellen.
  • Kodelinje 7: Henter guru99_det-dataene og tildeler værdien til lv_emp_name.
  • Kodelinje 9: Brug af markørattributten '%NOTFOUND' til at finde ud af, om hele posten i markøren er hentet. Hvis den hentes, vil den returnere 'TRUE', og kontrol vil forlade løkken, ellers vil kontrolelementet blive ved med at hente data fra markøren og udskrive dataene.
  • Kodelinje 11: EXIT-betingelse for loop-sætningen.
  • Kodelinje 12: Udskriv det hentede medarbejdernavn.
  • Kodelinje 14: Brug af markørattributten '%ROWCOUNT' til at finde det samlede antal poster, der blev påvirket/hentet i markøren.
  • Kodelinje 15: Efter at have forladt sløjfen lukkes markøren, og den tildelte hukommelse frigøres.

FOR Loop Cursor-erklæring

"FOR LOOP"-sætning kan bruges til at arbejde med markører. Vi kan give markørens navn i stedet for områdegrænsen i FOR loop-sætningen, så loopen vil arbejde fra markørens første post til markørens sidste post. Cursorvariablen, åbning af markør, hentning og lukning af markøren vil blive udført implicit af FOR-løkken.

Syntaks

DECLARE
CURSOR <cursor_name> IS <SELECT statement>;
BEGIN
  FOR I IN <cursor_name>
  LOOP
  .
  .
  END LOOP;
END;
  • I ovenstående syntaks indeholder deklarationsdelen markørens deklaration.
  • Cursoren oprettes til 'SELECT'-sætningen, der er angivet i markørerklæringen.
  • I udførelsesdelen er den erklærede markør sat op i FOR-løkken, og loop-variablen 'I' vil opføre sig som markørvariabel i dette tilfælde.

Oracle Markør for løkkeeksempel:
I dette eksempel vil vi projicere hele medarbejdernavnet fra emp-tabellen ved hjælp af 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;
/

Produktion

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

Kode Forklaring

  • Kodelinje 2: Erklærer markøren guru99_det for sætningen 'SELECT emp_name FROM emp'.
  • Kodelinje 4: Konstruktion af 'FOR'-løkken for markøren med loop-variablen lv_emp_name.
  • Kodelinje 5: Udskrivning af medarbejdernavnet i hver iteration af løkken.
  • Kodelinje 8: Forlad løkken

Bemærk: I Cursor-FOR loop kan markørattributter ikke bruges, da åbning, hentning og lukning af markøren sker implicit af FOR sløjfe.