Hva er CURSOR i PL / SQL?
En markør er en pekepinn til dette kontekstområdet. Oracle oppretter kontekstområde for behandling av en SQL-setning som inneholder all informasjon om utsagnet.
PL / SQL lar programmereren kontrollere kontekstområdet gjennom markøren. En markør inneholder radene som returneres av SQL-setningen. Settet med rader markøren har, blir referert til som aktivt sett. Disse markørene kan også navngis slik at de kan henvises fra et annet sted i koden.
I denne veiledningen vil du lære-
- Implisitt markør
- Eksplisitt markør
- Markørattributter
- FOR Loop Cursor statement
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 inneholder 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 bare referere til den siste markøren gjennom markørattributtene.
Eksplisitt markør
Programmører har lov til å opprette navngitt kontekstområde for å utføre DML-operasjoner for å få mer kontroll over det. Den eksplisitte markøren skal defineres i erklæringsdelen av PL / SQL-blokken, og den opprettes for "SELECT" -uttrykket som må brukes i koden.
Nedenfor er trinn som involverte seg i å jobbe med eksplisitte markører.
- Erklærer markøren
Å erklære markøren betyr ganske enkelt å opprette et navngitt kontekstområde for 'SELECT' -uttrykket som er definert i erklæringsdelen. Navnet på dette kontekstområdet er det samme som markørnavnet.
- Åpningsmarkør
Åpne markøren vil gi PL / SQL beskjed om å tildele minnet til denne markøren. Det vil gjøre markøren klar til å hente postene.
- Henter data fra markøren
I denne prosessen kjøres 'SELECT' -utsagnet og radene som hentes lagres i det tildelte minnet. Disse kalles nå som aktive sett. Å hente data fra markøren er en aktivitet på postnivå som betyr at vi kan få tilgang til dataene på en post-for-post måte.
Hver hentingsuttalelse henter ett aktivt sett og inneholder informasjonen for den aktuelle posten. Denne påstanden er den samme som 'SELECT' -uttrykk som henter posten og tildeler variabelen i 'INTO' -klausulen, men den gir ingen unntak.
- Lukke markøren
Når all posten er hentet nå, må vi lukke markøren slik at minnet som er tildelt dette kontekstområdet vil bli frigitt.
Syntaks:
DECLARECURSORIS
- I den ovennevnte syntaksen inneholder erklæringsdelen erklæringen til markøren og markørvariabelen der de hentede dataene blir tildelt.
- Markøren blir opprettet for "SELECT" -uttalelsen som er gitt i markørerklæringen.
- I utførelsesdelen åpnes, hentes og lukkes den erklærte markøren.
Markørattributter
Både implisitt markør og eksplisitt markør har visse attributter som er tilgjengelige. Disse attributtene gir mer informasjon om markøroperasjonene. Nedenfor er de forskjellige markørattributtene og deres bruk.
Markørattributt | Beskrivelse |
%FUNNET | Det returnerer det boolske resultatet 'SANT' hvis den siste hentingsoperasjonen hentet en post med hell, ellers vil den returnere FALSE. |
%IKKE FUNNET | Dette fungerer motsatt av% FOUND, det vil returnere 'TRUE' hvis den siste hentingsoperasjonen ikke kunne hente noen post. |
%ER ÅPEN | Det returnerer boolsk resultat 'SANT' hvis den gitte markøren allerede er åpnet, ellers returnerer den 'FALSE' |
% ROWCOUNT | Den returnerer den numeriske verdien. Det gir den faktiske tellingen av poster som ble påvirket av DML-aktiviteten. |
Eksempel 1 : I dette eksemplet skal vi se hvordan vi kan erklære, åpne, hente og lukke den eksplisitte markøren.
Vi vil projisere alt ansattens navn fra emp-tabellen ved hjelp av en markør. Vi vil også bruke markørattributt til å sette løkken for å hente all 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:/
Produksjon
Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYYTotal rows fetched is 3
Kode Forklaring:
- Kodelinje 2 : Erklærer markøren guru99_det for utsagnet 'VELG emp_name FRA emp'.
- Kodelinje 3 : Erklærende variabel lv_emp_name.
- Kodelinje 5 : Åpne markøren guru99_det.
- Kodelinje 6: Angi grunnleggende sløyfesetning for å hente alle postene i 'emp' -tabellen.
- Kodelinje 7: Henter guru99_det-dataene og tilordner verdien til lv_emp_name.
- Kodelinje 9: Bruk markørattributtet '% NOTFOUND' for å finne ut om all posten i markøren blir hentet. Hvis hentet, vil den returnere 'SANT' og kontroll vil gå ut av sløyfen, 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 ansattens navn.
- Kodelinje 14: Bruk markørattributtet '% ROWCOUNT' for å finne det totale antallet poster som ble berørt / hentet i markøren.
- Kodelinje 15: Etter at du har gått ut av sløyfen, lukkes markøren og det tildelte minnet frigjøres.
FOR Loop Cursor statement
"FOR LOOP" -uttrykk kan brukes til å arbeide med markører. Vi kan gi markørnavnet i stedet for rekkevidde i FOR-sløyfesetningen, slik at sløyfen fungerer fra den første posten til markøren til den siste posten til markøren. Markørvariabelen, åpning av markøren, henting og lukking av markøren gjøres implisitt av FOR-sløyfen.
Syntaks:
DECLARECURSORIS
- I ovennevnte syntaks inneholder erklæringsdelen erklæringen til markøren.
- Markøren blir opprettet for "SELECT" -uttalelsen som er gitt i markørerklæringen.
- I utførelsesdelen er den erklærte markøren satt opp i FOR-sløyfen, og sløyfevariabelen 'I' vil oppføre seg som markørvariabel i dette tilfellet.
Eksempel 1 : I dette eksemplet vil vi projisere alt ansattens navn fra emp-tabellen ved hjelp av en markør-FOR-løkke.
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;/
Produksjon
Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYY
Kode Forklaring:
- Kodelinje 2 : Erklærer markøren guru99_det for utsagnet 'VELG emp_name FRA emp'.
- Kodelinje 4 : Konstruere 'FOR' sløyfen for markøren med sløyfevariabelen lv_emp_name.
- Kodelinje 5: Skriver ut ansattens navn i hver iterasjon av sløyfen.
- Kodelinje 8: Gå ut av sløyfen
Merk: I markør-FOR-løkke kan ikke markørattributter brukes siden åpning, henting og lukking av markøren implisitt gjøres av FOR-løkke.