Sunteți pe pagina 1din 9

31.10.

2022

ACADEMIA DE STUDII ECONOMICE BUCUREŞTI


FACULTATEA DE CIBERNETICĂ, STATISTICĂ ŞI INFORMATICĂ ECONOMICĂ

SGBD Oracle
CURSUL 6

BUCUREŞTI
2022-2023

Conf.univ.dr. IULIANA BOTHA (ȘIMONCA)

Agenda
1. Limbajul PL/SQL - cursorul implicit
2. Limbajul PL/SQL - cursorul explicit
3. Limbajul PL/SQL - exerciții recapitulative

1
31.10.2022

LIMBAJUL PL/SQL
MECANISMUL DE CURSOR

Mecanismul de cursor
❑ Atunci când se execută o comandă SQL, Oracle Server deschide
o zonă de memorie (context area) în care comanda este
executată. Cursorul este un pointer către această zonă
❑ În PL/SQL se utilizează două tipuri de cursoare:
1) implicit: declarat pentru toate instrucţiunile PL/SQL de tip LMD
(INSERT / UPDATE / DELETE /SELECT care returnează un singur
rând);
2) explicit: declarat şi gestionat de programator pentru a procesa
individual fiecare rând returnat de o instrucţiune SELECT care
generează mai multe rânduri.

2
31.10.2022

Mecanismul de cursor
Cursorul implicit

Atributele cursorului implicit, prin care se testează modul de


execuţie a comenzilor LMD:
Atribut Tip Descriere
SQL%FOUND Boolean Evaluat la TRUE dacă ultima comandă LMD a afectat /
returnat cel puţin un rând
Evaluat la NULL înainte de execuţia unei comenzi LMD
SQL%NOTFOUND Boolean Evaluat la TRUE dacă ultima comandă LMD nu a
afectat / returnat niciun rând
Complementar atributului %FOUND
Evaluat la NULL înainte de execuţia unei comenzi LMD
SQL%ROWCOUNT Number Returnează numărul de rânduri afectate de ultima
comandă LMD
Evaluat la NULL înainte de execuţia unei comenzi LMD
SQL%ISOPEN Boolean Evaluat la FALSE după execuţia unei comenzi LMD

Mecanismul de cursor
Cursorul implicit

BEGIN
UPDATE angajati
SET comision=0.2
WHERE salariul < 2000;
IF SQL%NOTFOUND THEN
DBMS_OUTPUT.PUT_LINE('Nu exista angajati cu salariul
mai mic decat limita');
ELSE
DBMS_OUTPUT.PUT_LINE('S-a modificat comisionul pentru
'|| SQL%ROWCOUNT || ' angajati');
END IF;
COMMIT;
END;
/

3
31.10.2022

Mecanismul de cursor
Cursorul explicit

Prelucrarea cursorului explicit presupune parcurgerea


următoarelor etape:
1. Declararea variabilelor
2. Declararea cursorului, specificând fraza SELECT
CURSOR nume_cursor IS SELECT .....;

3. Deschiderea cursorului
OPEN nume_cursor;
4. Încărcarea liniilor din cursor în variabile
FETCH nume_cursor INTO var1, var2, ...;

5. Închiderea cursorului
CLOSE nume_cursor;

Mecanismul de cursor
Cursorul explicit

Atributele cursorului explicit:

Atribut Tip Descriere


%ISOPEN Boolean Evaluat la TRUE atunci când cursorul a fost deschis
%FOUND Boolean Evaluat la TRUE atunci când cel mai recent FETCH
a returnat un rând
Evaluat la NULL înainte de primul FETCH
%NOTFOUND Boolean Evaluat la TRUE atunci când cel mai recent FETCH
nu a returnat niciun rând
Complementar atributului %FOUND
Evaluat la NULL înainte de primul FETCH
%ROWCOUNT Number Returnează numărul total de rânduri parcurse
până în acel moment
Evaluat la NULL înainte de prima parcurgere

4
31.10.2022

Mecanismul de cursor
Cursorul explicit

DECLARE
CURSOR c IS SELECT id_angajat, nume, salariul FROM
angajati WHERE id_departament=60;
v_id angajati.id_angajat%TYPE;
v_nume angajati.nume%TYPE;
v_sal angajati.salariul%TYPE;
BEGIN
OPEN c;
LOOP
FETCH c INTO v_id, v_nume, v_sal;
EXIT WHEN c%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Salariatul '||v_nume||' are
salariul: '||v_sal);
END LOOP;
CLOSE c;
END;
/
9

Mecanismul de cursor
Cursorul explicit

DECLARE
CURSOR c IS SELECT id_angajat, nume, salariul FROM
angajati WHERE id_departament=60;
rec_c c%ROWTYPE;
BEGIN
OPEN c;
LOOP
FETCH c INTO rec_c;
EXIT WHEN c%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Salariatul '||rec_c.nume||' are
salariul: '||rec_c.salariul);
END LOOP;
CLOSE c;
END;
/

10

5
31.10.2022

Atributul %ROWTYPE
DECLARE
CURSOR c IS SELECT id_angajat, nume, salariul FROM
angajati WHERE id_departament=60;
rec_c c%ROWTYPE;
Elemente ale rec_c
............
id_angajat, nume, salariul
DECLARE
CURSOR c IS SELECT nr_comanda, COUNT(id_produs)
numar_produse FROM .....;
rec_c c%ROWTYPE; Elemente ale rec_c
............ nr_comanda, numar_produse
DECLARE
CURSOR c IS SELECT * FROM tari;
rec_c c%ROWTYPE; Elemente ale rec_c
Id_tara, denumire_tara, id_regiune
11

Mecanismul de cursor
Cursorul explicit

Gestiunea cursorului prin utilizarea unui ciclu FOR

FOR variabila_compusa IN nume_cursor LOOP


-----
END LOOP;

✓ în acest caz, variabila compusă nu trebuie declarată;


✓ se realizează în mod implicit deschiderea, încărcarea şi
închiderea cursorului.

12

6
31.10.2022

Mecanismul de cursor
Cursorul explicit

Utilizarea unui cursor direct în cadrul instrucţiunii FOR

FOR NUME_RECORD IN (SELECT ...) LOOP


-----
END LOOP;

✓ în acest caz cursorul nu este declarat, nu are nume, este


reprezentat doar de interogarea SELECT din cadrul
instrucţiunii FOR;
✓ dezavantajul este ca nu se pot utiliza atributele cursorului
din cauza faptului că acesta nu are nume.

13

Mecanismul de cursor
Cursorul explicit
DECLARE BEGIN
CURSOR c IS SELECT FOR rec_ang IN (SELECT
id_angajat, nume, salariul id_angajat, nume, salariul
FROM angajati WHERE FROM angajati WHERE
id_departament=60; id_departament=60)
BEGIN LOOP
FOR rec_ang IN c LOOP DBMS_OUTPUT.PUT_LINE
('Salariatul '||
DBMS_OUTPUT.PUT_LINE
rec_ang.nume || ' are
('Salariatul '|| salariul: ' ||
rec_ang.nume || ' are rec_ang.salariul);
salariul: ' ||
rec_ang.salariul); END LOOP;
END LOOP; END;
END; /
/ 14

7
31.10.2022

Rezolvaţi
Ce va afişa blocul PL/SQL?

DECLARE
CURSOR c1 IS SELECT * FROM angajati ORDER BY salariul DESC;
r1 c1%ROWTYPE;

BEGIN
OPEN c1;
WHILE c1%FOUND
LOOP
DBMS_OUTPUT.PUT_LINE(r1.nume);
FETCH c1 INTO r1;
END LOOP;
CLOSE c1;
END;
/

Rezolvaţi
Ce va afişa blocul PL/SQL?

DECLARE
CURSOR c1 IS SELECT * FROM angajati ORDER BY salariul DESC;

BEGIN
OPEN c1;
FOR r1 IN c1 LOOP
DBMS_OUTPUT.PUT_LINE(r1.nume);
END LOOP;
CLOSE c1;
END;
/

8
31.10.2022

Rezolvaţi
Ce va afişa blocul PL/SQL?

DECLARE
CURSOR c IS SELECT nume FROM angajati WHERE id_angajat=3;
r c%ROWTYPE;

BEGIN
OPEN c;
FETCH c INTO r;
IF c%ROWCOUNT = 0 THEN
DBMS_OUTPUT.PUT_LINE('nu s-au preluat date in setul
curent');
ELSE DBMS_OUTPUT.PUT_LINE(r.nume);
END IF;
CLOSE c;
END;
/

CURSUL 7...

Limbajul PL/SQL. Tratarea excepţiilor.

S-ar putea să vă placă și