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.
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.