Documente Academic
Documente Profesional
Documente Cultură
2022
SGBD Oracle
CURSUL 6
BUCUREŞTI
2022-2023
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
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
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
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
12
6
31.10.2022
Mecanismul de cursor
Cursorul explicit
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...