Oracle Cursor PL/SQL: implicit, explicit, buclă For cu exemplu
Ce este CURSOR în PL/SQL?
Un cursor este un indicator către această zonă de context. Oracle creează o zonă de context pentru procesarea unei instrucțiuni SQL care conține toate informațiile despre instrucțiune.
PL/SQL permite programatorului să controleze zona de context prin intermediul cursorului. Un cursor deține rândurile returnate de instrucțiunea SQL. Setul de rânduri pe care le deține cursorul este denumit set activ. Acești cursori pot fi, de asemenea, denumiti astfel încât să poată fi referiți dintr-un alt loc al codului.
Cursorul este de două tipuri.
- Cursor implicit
- Cursor explicit
Cursor implicit
Ori de câte ori apar operațiuni DML în baza de date, este creat un cursor implicit care reține rândurile afectate, în acea operațiune particulară. Acești cursori nu pot fi denumiti și, prin urmare, nu pot fi controlați sau referiți din alt loc al codului. Ne putem referi doar la cel mai recent cursor prin atributele cursorului.
Cursor explicit
Programatorilor li se permite să creeze o zonă de context numită pentru a-și executa operațiunile DML pentru a obține mai mult control asupra acesteia. Cursorul explicit ar trebui definit în secțiunea declarație a fișierului bloc PL/SQL, și este creat pentru instrucțiunea „SELECT” care trebuie utilizată în cod.
Mai jos sunt pașii care implică lucrul cu cursoare explicite.
- Declararea cursorului Declararea cursorului înseamnă pur și simplu a crea o zonă de context numită pentru instrucțiunea „SELECT” care este definită în partea de declarație. Numele acestei zone de context este același cu numele cursorului.
- Deschiderea cursoruluiDeschiderea cursorului va instrui PL / SQL pentru a aloca memorie pentru acest cursor. Acesta va face cursorul gata pentru a prelua înregistrările.
- Preluarea datelor de pe cursorÎn acest proces, instrucțiunea „SELECT” este executată și rândurile preluate sunt stocate în memoria alocată. Acestea sunt acum numite seturi active. Preluarea datelor de pe cursor este o activitate la nivel de înregistrare, ceea ce înseamnă că putem accesa datele într-un mod înregistrare cu înregistrare. Fiecare instrucțiune de preluare va prelua un set activ și deține informațiile acelei înregistrări. Această instrucțiune este aceeași cu instrucțiunea „SELECT” care preia înregistrarea și o atribuie variabilei din clauza „INTO”, dar nu va arunca nicio excepție.
- Închiderea cursoruluiOdată ce toate înregistrările sunt preluate acum, trebuie să închidem cursorul, astfel încât memoria alocată acestei zone de context să fie eliberată.
Sintaxă
DECLARE CURSOR <cursor_name> IS <SELECT statement^> <cursor_variable declaration> BEGIN OPEN <cursor_name>; FETCH <cursor_name> INTO <cursor_variable>; . . CLOSE <cursor_name>; END;
- În sintaxa de mai sus, partea declarație conține declarația cursorului și variabila cursorului în care vor fi atribuite datele preluate.
- Cursorul este creat pentru instrucțiunea „SELECT” care este dată în declarația cursorului.
- În partea de execuție, cursorul declarat este deschis, preluat și închis.
Atributele cursorului
Atât cursorul implicit, cât și cursorul explicit au anumite atribute care pot fi accesate. Aceste atribute oferă mai multe informații despre operațiile cursorului. Mai jos sunt diferitele atribute ale cursorului și utilizarea lor.
Atributul cursorului | Description |
---|---|
%GĂSITE | Returnează rezultatul boolean „TRUE” dacă cea mai recentă operațiune de preluare a preluat o înregistrare cu succes, altfel va returna FALSE. |
%NU A FOST GĂSIT | Acest lucru funcționează opus față de %FOUND, va returna „TRUE” dacă cea mai recentă operațiune de preluare nu poate prelua nicio înregistrare. |
%ESTE DESCHIS | Returnează rezultatul boolean „TRUE” dacă cursorul dat este deja deschis, altfel returnează „FALSE” |
%ROWCOUNT | Returnează valoarea numerică. Oferă numărul real de înregistrări care au fost afectate de activitatea DML. |
Exemplu de cursor explicit:
În acest exemplu, vom vedea cum să declarăm, să deschidem, să aducem și să închidem cursorul explicit.
Vom proiecta tot numele angajatului din tabelul emp folosind un cursor. Vom folosi, de asemenea, atributul cursor pentru a seta bucla pentru a prelua toate înregistrările de pe cursor.
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: /
producție
Employee Fetched:BBB Employee Fetched:XXX Employee Fetched:YYY Total rows fetched is 3
Explicarea codului
- Linia de cod 2: Declararea cursorului guru99_det pentru instrucțiunea „SELECT emp_name FROM emp”.
- Linia de cod 3: Declararea variabilei lv_emp_name.
- Linia de cod 5: Deschiderea cursorului guru99_det.
- Linia de cod 6: Setarea instrucțiunii de buclă de bază pentru a prelua toate înregistrările din tabelul „emp”.
- Linia de cod 7: Preia datele guru99_det și atribuie valoarea lui lv_emp_name.
- Linia de cod 9: Folosind atributul cursorului „%NOTFOUND” pentru a afla dacă toate înregistrările din cursor sunt preluate. Dacă este preluat, va returna „TRUE” și controlul va ieși din buclă, altfel controlul va continua să preia datele de pe cursor și să imprime datele.
- Linia de cod 11: Condiție EXIT pentru instrucțiunea buclă.
- Linia de cod 12: Tipăriți numele angajatului preluat.
- Linia de cod 14: Folosind atributul cursorului „%ROWCOUNT” pentru a găsi numărul total de înregistrări care au fost afectate/preluate în cursor.
- Linia de cod 15: După ieșirea din buclă, cursorul este închis și memoria alocată este eliberată.
FOR Loop Cursor instrucțiune
Instrucțiunea „FOR LOOP” poate fi folosită pentru a lucra cu cursoare. Putem da numele cursorului în loc de limita de interval în instrucțiunea de buclă FOR, astfel încât bucla să funcționeze de la prima înregistrare a cursorului până la ultima înregistrare a cursorului. Variabila cursorului, deschiderea cursorului, preluarea și închiderea cursorului se vor face implicit prin bucla FOR.
Sintaxă
DECLARE CURSOR <cursor_name> IS <SELECT statement>; BEGIN FOR I IN <cursor_name> LOOP . . END LOOP; END;
- În sintaxa de mai sus, partea declarație conține declarația cursorului.
- Cursorul este creat pentru instrucțiunea „SELECT” care este dată în declarația cursorului.
- În partea de execuție, cursorul declarat este configurat în bucla FOR și variabila buclă „I” se va comporta ca variabilă de cursor în acest caz.
Oracle Cursor pentru exemplu de buclă:
În acest exemplu, vom proiecta tot numele angajatului din tabelul emp folosind o buclă cursor-FOR.
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; /
producție
Employee Fetched:BBB Employee Fetched:XXX Employee Fetched:YYY
Explicarea codului
- Linia de cod 2: Declararea cursorului guru99_det pentru instrucțiunea „SELECT emp_name FROM emp”.
- Linia de cod 4: Construirea buclei „FOR” pentru cursor cu variabila buclă lv_emp_name.
- Linia de cod 5: Tipărirea numelui angajatului în fiecare iterație a buclei.
- Linia de cod 8: Ieși din buclă
Notă: În bucla Cursor-FOR, atributele cursorului nu pot fi folosite deoarece deschiderea, preluarea și închiderea cursorului se face implicit de către bucla FOR.