Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
Un cursor este o zona de lucru SQL privata. Exista doua tipuri de cursori: cursori impliciti care sunt folositi de Oracle Server la analizarea si executarea comenzilor SQL si cursori expliciti care sunt declarati explicit de programator.
Folosind atributele cursorului SQL putem testa rezultatul comenzilor SQL.
SQL%ROWCOUNT |
Numarul de randuri afectate de cea mai recenta comanda SQL (este o valoare intreaga). |
SQL%FOUND |
Atribut boolean care are valoarea TRUE daca cea mai recenta comanda SQL afecteaza una sau mai multe randuri. |
SQL%NOTFOUND |
Atribut boolean care este TRUE daca cea mai recenta comanda SQL nu afecteaza nici un rand. |
SQL%ISOPEN |
Intotdeauna are valoarea FALSE deoarece PL/SQL inchide cursorii impliciti imediat dupa ce sunt executati. |
Exemplu: Sterge randurile care sunt specificate din tabela ITEM si afiseaza numarul de randuri sterse.
VARIABLE rows_deleted
DECLARE
v_ordid NUMBER := 605;
BEGIN
DELETE FROM item
WHERE ordid = v_ordid;
: rows_deleted := SQL%ROWCOUNT || ' rows deleted.');
END;
PRINT rows_deleted;
Cursorii impliciti sunt declarati implicit de PL/SQL pentru toate operatiile de manipulare a datelor (DML) si pentru instructiunea SELECT PL/SQL, ei incluzand query-urile care returneaza numai un singur rand.
Cursorii explicti sunt declarati de catre programatori, ei incluzand query-urile care returneaza mai multe randuri.
Oracle Server deschide implicit un cursor la procesarea fiecarei instructiuni SQL careia nu este asociata un cursor declarat explicit. Nu putem folosi instructiunile de control OPEN, FETCH si CLOSE pentru controlul cursorului implicit SQL, dar putem folosi atributele cursorului la obtinerea informatiei despre cea mai recenta instructiune SQL executata.
Utilizam cursorii expliciti pentru procesarea individuala a fiecarui rand rezulat dintr-o instructiune SELECT cu multiple-randuri. Putem procesa un singur rand la un moment dat, acela numindu-se rand curent.
Folosim comenzile OPEN, FETCH si CLOSE la controlul unui cursor explict. Comanda OPEN executa query-ul asociat cursorului, identifica setul rezultat, si pozitioneaza cursorul pe primul rand. Comanda FETCH incarca randul curent al cursorului in variabile si avanseaza cursorul la urmatorul rand. Cand ultimul rand a fost procesat, comanda CLOSE dezactiveaza cursorul.
Pentru declararea unui cursor explicit folosim comanda CURSOR care are sintaxa:
CURSOR cursor_name IS
select_statement;
unde:
cursor_name este un identificator, numele cursorului.
select_statement este o instructiune SELECT fara clauza INTO.
Exemplu:
DECLARE
CURSOR c1 IS
SELECT empno, ename
FROM emp;
CURSOR c2 IS
SELECT *
FROM dept
WHERE deptno = 10;
BEGIN
.
Deschiderea unui cursor explict se realizeaza cu comanda OPEN care are sintaxa:
OPEN cursor_name;
unde:
cursor_name este numele unui cursor care a fost declarat.
Comanda OPEN deschide cursorul, identifica setul rezultat, ce e alcatuit din toate randurile ce indeplinesc criteriul de selectie a query-ului si puncteaza primul rand din setul rezultat.
Comanda FETCH salveaza valorile randului curent in variabile de iesire. Dupa fiecare comanda FETCH, cursorul avanseaza la urmatorul rand in setul rezultat. Sintaxa comenzi FETCH este:
FETCH cursor_name INTO [variable1, variable2, . ]
| record_name];
unde:
cursor_name este numele unui cursor declarat.
variable este o variabila de iesire care memoreaza rezultatele.
record_name este este numele inregistrari in care se salveaza datele. Variabila poate fi declarata folosind atributul %ROWTYPE.
Numarul variabilelor de iesire din clauza INTO trebuie sa fie acelasi cu cel al coloanelor din instructiunea SELECT .Tipul de data al fiecarei variabile trebuie sa corespunda cu tipul de data al coloanei.
Exemplu:
Parcurgem primi zece angajati, unul cate unul.
DECLARE
v_empno emp.empno%TYPE;
v_ename emp.ename%TYPE;
i NUMBER
CURSOR c1 IS
SELECT empno, ename
FROM emp;
BEGIN
OPEN c1;
FOR I IN 1 .. 10 LOOP
FETCH c1 INTO v_empno, v_ename;
.
END LOOP;
END;
Comanda CLOSE dezactiveaza cursorul, setul rezultat devenind nedefinit. Dupa inchiderea cursorului acesta poate fi redeschis, deci putem stabili un set activ de mai multe ori. Sintaxa comenzi este:
CLOSE cursor_name;
unde:
cursor_name este numele cursorului declarat anterior.
Exista patru atribute care ne dau informatii utile despre starea cursorilor expliciti. Acestea sunt prezentate in tabelul de mai jos.
Atribut |
Tip |
Descriere |
%ISOPEN |
Boolean |
Returneaza TRUE daca cursorul este deschis. |
%NOTFOUND |
Boolean |
Returneaza TRUE daca operatia de fetch curenta nu intoarce nici un rand. |
%FOUND |
Boolean |
Returneaza TRUE daca operatia de fetch curenta intoarce un rand.Este complementul lui %NOTFOUND. |
%ROWCOUNT |
Number |
Returneaza numarul total de randuri prelucrate pana in prezent. |
Pentru prelucrarea catorva randuri dintr-un cursor explicit, putem defini o bucla pentru parcurgerea unui fetch in fiecare iteratie. Putem prelucra randuri numai daca cursorul este deschis, vom folosi atributul %ISOPEN pentru a determina daca un cursor este deschis sau nu.
Exemplu:
Parcurgerea primilor zece angajati unul cate unul:
DECLARE
v_empno emp.empno%TYPE;
v_ename emp.ename%TYPE;
CURSOR c1 IS
SELECT empno, ename
FROM emp;
BEGIN
OPEN c1;
LOOP
FETCH c1 INTO v_empno, v_ename;
EXIT WHEN c1%ROWCOUNT>10 OR c1%NOTFOUND;
.
END LOOP;
CLOSE c1;
END;
Putem defini o inregistrare bazata pe lista coloanelor dintr-un cursor explicit. Astfel, valorile randului curent sunt incarcate direct in campurile corespondente ale inregistrarii. Vom exemplifca acest lucru prin urmatorul exemplu:
CURSOR c1 IS
SELECT empno, ename
FROM emp;
emp_record c1%ROWTYPE;
BEGIN
OPEN c1;
FETCH c1 INTO emp_record;
Copyright © 2024 - Toate drepturile rezervate