PL / SQL – Cursori
În acest capitol, vom discuta despre cursorii din PL / SQL. Oracle creează o zonă de memorie, cunoscută sub numele de zonă de context, pentru procesarea unei instrucțiuni SQL, care conține toate informațiile necesare procesării instrucțiunii; de exemplu, numărul de rânduri procesate etc.
Un cursor este un indicator către această zonă contextuală. PL / SQL controlează zona contextuală printr-un cursor. Un cursor reține rândurile (unul sau mai multe) returnate de o instrucțiune SQL. Setul de rânduri pe care le ține cursorul este denumit set activ.
Puteți denumi un cursor astfel încât să poată fi menționat într-un program pentru a prelua și procesa rândurile returnate de instrucțiunea SQL, una la un moment dat. Există două tipuri de cursoare –
- Cursoare implicite
- Cursoare explicite
Cursori implicite
Cursoare implicite sunt create automat de Oracle ori de câte ori este executată o instrucțiune SQL, atunci când nu există un cursor explicit pentru instrucțiune. Programatorii nu pot controla cursorii implicați și informațiile din acesta.
Ori de câte ori este emisă o instrucțiune DML (INSERT, UPDATE și DELETE), un cursor implicit este asociat cu această instrucțiune. Pentru operațiile INSERT, cursorul conține datele care trebuie inserate. Pentru operațiile UPDATE și DELETE, cursorul identifică rândurile care ar fi afectate.
În PL / SQL, puteți face referire la cel mai recent cursor implicit ca cursorul SQL, care are întotdeauna atribute precum% FOUND ,% ISOPEN,% NOTFOUND și% ROWCOUNT. Cursorul SQL are atribute suplimentare,% BULK_ROWCOUNT și% BULK_EXCEPTIONS, concepute pentru a fi utilizate cu instrucțiunea FORALL. Următorul tabel oferă descrierea celor mai utilizate atribute –
S.Nu | Atribut & Descriere |
---|---|
1 |
% FOUND Returnează TRUE dacă o instrucțiune INSERT, UPDATE sau DELETE a afectat unul sau mai multe rânduri sau o instrucțiune SELECT INTO a returnat unul sau mai multe rânduri. În caz contrar, returnează FALS. |
2 |
% NOTFOUND Opusul logic al% FOUND. Returnează TRUE dacă o instrucțiune INSERT, UPDATE sau DELETE nu a afectat niciun rând sau o instrucțiune SELECT INTO nu a returnat niciun rând. În caz contrar, returnează FALS. |
3 |
% ISOPEN Întoarce întotdeauna FALS pentru cursorile implicite, deoarece Oracle închide automat cursorul SQL după executarea instrucțiunii SQL asociate. |
4 |
% ROWCOUNT Returnează numărul de rânduri afectate de o instrucțiune INSERT, UPDATE sau DELETE sau returnate de o instrucțiune SELECT INTO. |
Orice atribut de cursor SQL va fi accesat ca sql% attribute_name așa cum se arată mai jos în exemplu.
Exemplu
Vom folosi tabelul CLIENTI pe care l-am creat și folosit în capitolele anterioare.
Următorul program va actualiza tabelul și va crește salariul fiecărui client cu 500 și va folosi SQL% Atributul ROWCOUNT pentru a determina numărul de rânduri afectate –
Când codul de mai sus este executat la promptul SQL, acesta produce următorul rezultat –
6 customers selected PL/SQL procedure successfully completed.
Dacă verificați înregistrările din tabelul clienților, veți găsi că rândurile au fost actualizate –
Cursori expliciți
Cursorii expliciți sunt cursori definiți de programator pentru a obține mai mult control asupra zona contextuală. Un cursor explicit trebuie definit în secțiunea de declarație a blocului PL / SQL. Este creat pe o instrucțiune SELECT care returnează mai multe rânduri.
Sintaxa pentru crearea unui cursor explicit este –
CURSOR cursor_name IS select_statement;
cu un cursor explicit include pașii următori –
- Declararea cursorului pentru inițializarea memoriei
- Deschiderea cursorului pentru alocarea memoriei
- Obținerea cursorului pentru recuperarea datelor
- Închiderea cursorului pentru a elibera memoria alocată
Declararea cursorului
Declararea cursorului definește cursorul cu un nume și declarația SELECT asociată. De exemplu –
CURSOR c_customers IS SELECT id, name, address FROM customers;
Deschiderea cursorului
Deschiderea cursorului alocă memoria pentru cursor și o pregătește pentru preluarea rândurilor returnate prin declarația SQL din ea. De exemplu, vom deschide cursorul definit mai sus după cum urmează –
OPEN c_customers;
Preluarea cursorului
Preluarea cursorului implică accesarea unui rând la o vreme. De exemplu, vom prelua rânduri de la cursorul deschis mai sus după cum urmează –
FETCH c_customers INTO c_id, c_name, c_addr;
Închiderea cursorului
Închiderea cursorului înseamnă eliberarea memoria alocată.De exemplu, vom închide cursorul deschis mai sus după cum urmează –
CLOSE c_customers;
Exemplu
Următorul este un exemplu complet pentru a ilustra conceptele de cursoare explicite & minua;
Când codul de mai sus este executat la promptul SQL, acesta produce următorul rezultat –
1 Ramesh Ahmedabad 2 Khilan Delhi 3 kaushik Kota 4 Chaitali Mumbai 5 Hardik Bhopal 6 Komal MP PL/SQL procedure successfully completed.