Hvad er CURSOR i PL / SQL?
En markør er en markør til dette kontekstområde. Oracle opretter kontekstområde til behandling af en SQL-sætning, der indeholder alle oplysninger om udsagnet.
PL / SQL giver programmøren mulighed for at kontrollere kontekstområdet gennem markøren. En markør indeholder de rækker, der returneres af SQL-sætningen. Sættet 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.
I denne vejledning lærer du-
- Implicit markør
- Eksplicit markør
- Markørattributter
- FOR Loop Cursor statement
Markøren er af to typer.
- Implicit markør
- Eksplicit markør
Implicit markør
Når der opstår DML-operationer i databasen, oprettes der 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 henvise til den seneste markør gennem markørattributterne.
Eksplicit markør
Programmører har lov til at oprette navngivet kontekstområde for at udføre deres DML-operationer for at få mere kontrol over det. Den eksplicitte markør skal defineres i erklæringsafsnittet i PL / SQL-blokken, og den oprettes til sætningen 'SELECT', der skal bruges i koden.
Nedenfor er trin, der involverede i arbejdet med eksplicitte markører.
- Erklæring om markøren
At erklære markøren betyder simpelthen at oprette et navngivet kontekstområde til 'SELECT' -sætningen, der er defineret i erklæringsdelen. Navnet på dette kontekstområde er det samme som markørnavnet.
- Åbning af markør
Åbning af markøren vil bede PL / SQL om at tildele hukommelsen til denne markør. Det gør markøren klar til at hente poster.
- Henter data fra markøren
I denne proces udføres 'SELECT'-sætningen, og de hentede rækker lagres i den tildelte hukommelse. Disse kaldes nu som aktive sæt. At hente data fra markøren er en aktivitet på postniveau, der betyder, at vi kan få adgang til dataene på en record-for-record-måde.
Hver hentningserklæring henter et aktivt sæt og indeholder oplysningerne om den pågældende post. Denne sætning er den samme som 'SELECT' -erklæring, der henter posten og tildeler variablen i 'INTO' -klausulen, men den giver ingen undtagelser.
- Lukning af markøren
Når hele posten er hentet nu, skal vi lukke markøren, så den hukommelse, der er allokeret til dette kontekstområde, frigives.
Syntaks:
DECLARECURSORIS
- I ovenstående syntaks indeholder erklæringsdelen en erklæring om markøren og den markørvariabel, hvori de hentede data tildeles.
- Markøren oprettes til 'VÆLG' udsagnet, der er angivet i markørerklæringen.
- I eksekveringsdel å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 er tilgængelige. Disse attributter giver mere information om markørhandlingerne. Nedenfor er de forskellige markørattributter og deres anvendelse.
Markørattribut | Beskrivelse |
% FUNDET | Det returnerer det boolske resultat 'TRUE', hvis den seneste hentningshandling hentede en post med succes, ellers returnerer den FALSE. |
%IKKE FUNDET | Dette fungerer modsat% FOUND, det vil returnere 'TRUE', hvis den seneste hentningsoperation ikke kunne hente nogen post. |
%ER ÅBEN | Det returnerer det boolske resultat 'SAND', hvis den givne markør allerede er åbnet, ellers returnerer den 'FALSK' |
% ROWCOUNT | Den returnerer den numeriske værdi. Det giver det faktiske antal optagelser, der blev påvirket af DML-aktiviteten. |
Eksempel 1 : I dette eksempel skal vi se, hvordan man erklærer, åbner, henter og lukker den eksplicitte markør.
Vi projicerer hele medarbejderens navn fra emp-tabellen ved hjælp af en markør. Vi bruger også markørattribut til at indstille sløjfen til at hente hele posten fra markøren.
DECLARECURSOR guru99_det IS SELECT emp_name FROM emp;lv_emp_name emp.emp_name%type;BEGINOPEN guru99_det;LOOPFETCH guru99_det INTO lv_emp_name;IF guru99_det%NOTFOUNDTHENEXIT;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:BBBEmployee Fetched:XXXEmployee Fetched:YYYTotal rows fetched is 3
Kode Forklaring:
- Kodelinje 2 : Erklæring om markøren guru99_det for udsagn 'VÆLG emp_name FRA emp'.
- Kodelinje 3 : Erklærende variabel lv_emp_name.
- Kodelinje 5 : Åbning af markøren guru99_det.
- Kodelinje 6: Indstilling af grundlæggende loop-sætning til at hente alle poster i 'emp' -tabellen.
- Kodelinje 7: Henter guru99_det-dataene og tildeler værdien til lv_emp_name.
- Kodelinje 9: Brug markørattributten '% NOTFOUND' til at finde ud af, om al post i markøren er hentet. Hvis det hentes, returnerer det 'TRUE', og kontrollen forlader sløjfen, ellers fortsætter kontrollen med at hente dataene fra markøren og udskrive dataene.
- Kodelinje 11: EXIT-betingelse for loop-sætningen.
- Kodelinje 12: Udskriv det hentede medarbejdernavn.
- Kodelinje 14: Brug markørattributten '% ROWCOUNT' til at finde det samlede antal poster, der blev påvirket / hentet i markøren.
- Kodelinje 15: Efter afslutning fra sløjfen lukkes markøren, og den tildelte hukommelse frigøres.
FOR Loop Cursor statement
"FOR LOOP" -erklæringen kan bruges til at arbejde med markører. Vi kan give markørnavnet i stedet for rækkevidde i FOR-loop-sætningen, så loop fungerer fra den første post af markøren til den sidste post af markøren. Markørvariablen, åbning af markøren, hentning og lukning af markøren sker implicit af FOR-sløjfen.
Syntaks:
DECLARECURSORIS
- I ovenstående syntaks indeholder erklæringsdelen markørens erklæring.
- Markøren oprettes til 'VÆLG' udsagnet, der er angivet i markørerklæringen.
- I udførelsesdelen er den erklærede markør opsat i FOR-sløjfen, og sløjfevariablen 'I' opfører sig som markørvariabel i dette tilfælde.
Eksempel 1 : I dette eksempel projicerer vi hele medarbejdernavnet fra EMP-tabel ved hjælp af en cursor-FOR-loop.
DECLARECURSOR guru99_det IS SELECT emp_name FROM emp;BEGINFOR lv_emp_name IN guru99_detLOOPDbms_output.put_line(‘Employee Fetched:‘||lv_emp_name.emp_name);END LOOP;END;/
Produktion
Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYY
Kode Forklaring:
- Kodelinje 2 : Erklæring om markøren guru99_det for udsagn 'VÆLG emp_name FRA emp'.
- Kodelinje 4 : Konstruktion af 'FOR' loop til markøren med loop variablen lv_emp_name.
- Kodelinje 5: Udskrivning af medarbejdernavnet i hver iteration af sløjfen.
- Kodelinje 8: Afslut sløjfen
Bemærk: I Cursor-FOR-loop kan markørattributter ikke bruges, da åbning, hentning og lukning af markøren implicit foretages af FOR-loop.