Home - Rasfoiesc.com
Educatie Sanatate Inginerie Business Familie Hobby Legal
Doar rabdarea si perseverenta in invatare aduce rezultate bune.stiinta, numere naturale, teoreme, multimi, calcule, ecuatii, sisteme




Biologie Chimie Didactica Fizica Geografie Informatica
Istorie Literatura Matematica Psihologie

Sql


Index » educatie » » informatica » Sql
Definirea cursorilor


Definirea cursorilor


Definirea cursorilor

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;







Politica de confidentialitate





Copyright © 2023 - Toate drepturile rezervate