Ce este CURSOR în PL / SQL?
Un cursor este un indicator către această zonă contextuală. Oracle creează o zonă contextuală 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 reține rândurile returnate de instrucțiunea SQL. Setul de rânduri pe care le ține cursorul este denumit set activ. Acești cursori pot fi, de asemenea, numiți astfel încât să poată fi direcționați dintr-un alt loc al codului.
În acest tutorial veți învăța-
- Cursor implicit
- Cursor explicit
- Atribute ale cursorului
- Pentru declarația cursorului buclei
Cursorul este de două tipuri.
- Cursor implicit
- Cursor explicit
Cursor implicit
Ori de câte ori apar operații DML în baza de date, se creează un cursor implicit care reține rândurile afectate, în acea operație specială. Acești cursori nu pot fi numiți și, prin urmare, nu pot fi controlați sau menționați dintr-un 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ă contextuală numită pentru a-și executa operațiunile DML pentru a obține mai mult control asupra acesteia. Cursorul explicit trebuie definit în secțiunea de declarație a blocului 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 crearea unei zone de context denumite pentru declarația „SELECT” care este definită în partea de declarație. Numele acestei zone de context este același cu numele cursorului.
- Se deschide cursorul
Deschiderea cursorului va instrui PL / SQL să aloce memoria pentru acest cursor. Acesta va pregăti cursorul să preia înregistrările.
- Preluarea datelor de la cursor
În acest proces, se execută instrucțiunea „SELECT” și rândurile preluate sunt stocate în memoria alocată. Acestea sunt acum numite seturi active. Preluarea datelor de la 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 respectivei înregistrări. Această instrucțiune este aceeași cu instrucțiunea „SELECT” care preia înregistrarea și atribuie variabilei din clauza „INTO”, dar nu va arunca excepții.
- Închiderea cursorului
Odată ce toată înregistrarea este preluată acum, trebuie să închidem cursorul, astfel încât memoria alocată acestei zone de context să fie eliberată.
Sintaxă:
DECLARECURSORIS
- În sintaxa de mai sus, partea de declarație conține declarația cursorului și a variabilei de cursor în care vor fi atribuite datele preluate.
- Cursorul este creat pentru declarația „SELECT” care este dată în declarația cursorului.
- În partea de execuție, cursorul declarat este deschis, preluat și închis.
Atribute ale 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 diferite atribute ale cursorului și utilizarea acestora.
Atribut cursor | Descriere |
%GĂSITE | Returnează rezultatul boolean „TRUE” dacă cea mai recentă operație de preluare a preluat cu succes o înregistrare, altfel va reveni FALS. |
%NU A FOST GASIT | Acest lucru funcționează în mod opus% FOUND, va reveni la „TRUE” dacă cea mai recentă operație de preluare nu a putut 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. |
Exemplul 1 : În acest exemplu, vom vedea cum să declarăm, să deschidem, să preluăm și să închidem cursorul explicit.
Vom proiecta tot numele angajatului din tabela emp folosind un cursor. De asemenea, vom folosi atributul cursor pentru a seta bucla pentru a prelua toate înregistrările de la cursor.
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:/
Ieșire
Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYYTotal rows fetched is 3
Explicatie cod:
- Linia de cod 2 : Declararea cursorului guru99_det pentru declarația „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: Descarcă datele guru99_det și atribuie valoarea lui lv_emp_name.
- Linia de cod 9: Folosind atributul cursorului „% NOTFOUND” pentru a afla dacă toată înregistrarea din cursor este preluată. Dacă este preluat, acesta va reveni la „ADEVĂRAT” și controlul va ieși din buclă, altfel controlul va continua să preia datele de la cursor și să imprime datele.
- Linia de cod 11: condiția EXIT pentru instrucțiunea buclă.
- Linia de cod 12: Imprimaț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ă.
Pentru declarația cursorului buclei
Instrucțiunea „FOR LOOP” poate fi utilizată pentru lucrul cu cursorele. Putem da numele cursorului în loc de limita intervalului în instrucțiunea buclă FOR, astfel încât bucla să funcționeze de la prima înregistrare a cursorului până la ultima înregistrare a cursorului. Variabila cursor, deschiderea cursorului, preluarea și închiderea cursorului se vor face implicit de bucla FOR.
Sintaxă:
DECLARECURSORIS
- În sintaxa de mai sus, partea de declarație conține declarația cursorului.
- Cursorul este creat pentru declarația „SELECT” care este dată în declarația cursorului.
- În partea de execuție, cursorul declarat este configurat în bucla FOR și variabila de buclă „I” se va comporta ca variabilă de cursor în acest caz.
Exemplul 1 : În acest exemplu, vom proiecta tot numele angajatului din tabela emp folosind o buclă cursor-FOR.
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;/
Ieșire
Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYY
Explicatie cod:
- Linia de cod 2 : Declararea cursorului guru99_det pentru declarația „SELECT emp_name FROM emp”.
- Linia de cod 4 : Construirea buclei 'FOR' pentru cursor cu variabila de buclă lv_emp_name.
- Linia de cod 5: Tipărirea numelui angajatului în fiecare iterație a buclei.
- Linia de cod 8: Ieșiți din buclă
Notă: În bucla Cursor-FOR, atributele cursorului nu pot fi utilizate deoarece deschiderea, preluarea și închiderea cursorului se face implicit de bucla FOR.