Sunteți pe pagina 1din 5

Facultatea de Cibernetic, Statistic i Informatic Economic SGBD Oracle seminarul 7

CURSORUL N PL/SQL (continuare)


- CURSORUL EXPLICIT Gestiunea implicit a cursorului prin utilizarea unui ciclu FOR: FOR nume_record IN nume_cursor LOOP -------------------------------------------------------END LOOP; n acest caz, tipul RECORD nu trebuie declarat. Se realizeaz n mod implicit deschiderea, ncrcarea i nchiderea cursorului. Exemplu: --S se afieze firmele din regiunea Banat: SET SERVEROUTPUT ON DECLARE CURSOR c_firme IS select codfirma, denfirma, loc from firme where zona='BANAT'; BEGIN DBMS_OUTPUT.PUT_LINE('Lista cu firmele din Banat: '); FOR rec_firme IN c_firme LOOP DBMS_OUTPUT.PUT_LINE('Firma ' ||rec_firme.denfirma|| ' este din localitatea: '|| rec_firme.loc); END LOOP; END; / Cursor cu parametru Declarare: Cursor nume_cursor (parametru1 tip_data,.....) Is select .................; Deschidere: Open nume_cursor(valoare_parametru1,......); cursoarele parametrizate nu ofer o funcionalitate suplimentar ci doar o modalitate simpl i clar de a specifica valori de intrare. tipurile parametrilor sunt scalare, dar nu li se precizeaz dimensiunea; ele fiind referite n interogare.

Exemple: -- S se afieze produsele al cror stoc este mai mare dect o valoare primit drept parametru. SET SERVEROUTPUT ON DECLARE
1

Facultatea de Cibernetic, Statistic i Informatic Economic SGBD Oracle seminarul 7

CURSOR c_prod (p_stoc NUMBER) IS SELECT codprodus, denprodus, um, stoc FROM produse WHERE stoc > p_stoc ORDER BY stoc desc; v_stoc NUMBER(5); rec_prod c_prod%rowtype; BEGIN v_stoc:=150; DBMS_OUTPUT.PUT_LINE('Produsele al caror stoc este mai mare decat '|| v_stoc); IF NOT c_prod%ISOPEN THEN OPEN c_prod (v_stoc); END IF; LOOP FETCH c_prod into rec_prod; EXIT WHEN c_prod%notfound; DBMS_OUTPUT.PUT_LINE('Produsul '||rec_prod.codprodus||', '|| rec_prod.denprodus||', are stocul ' ||rec_prod.stoc); END LOOP; CLOSE c_prod; END; / -- S se afieze pentru fiecare comanda produsele comandate. SET SERVEROUTPUT ON DECLARE --cursorul care va prelua comenzile incheiate CURSOR c_com IS SELECT nrcom, data FROM comenzi ORDER BY nrcom; --cursorul care, pentru fiecare comanda, va afisa produsele din cadrul acesteia, ordonate descrescator CURSOR c_prod (p_nrcom NUMBER) IS SELECT r.codprodus, p.denprodus, p.stoc FROM produse p, rindcom r WHERE p.codprodus=r.codprodus AND r.nrcom=p_nrcom ORDER BY r.codprodus desc; rec_com c_com%rowtype; --variabila record pentru campurile din primul cursor rec_prod c_prod%rowtype; --variabila record pentru campurile din al doilea cursor

Facultatea de Cibernetic, Statistic i Informatic Economic SGBD Oracle seminarul 7

BEGIN OPEN c_com; LOOP FETCH c_com into rec_com; EXIT WHEN c_com%notfound; DBMS_OUTPUT.PUT_LINE('Comanda '|| rec_com.nrcom ||' incheiata la data de '|| rec_com.data); OPEN c_prod (rec_com.nrcom); --cursorul primeste drept parametru numarul comenzii care a fost afisata LOOP FETCH c_prod into rec_prod; EXIT WHEN c_prod%notfound; DBMS_OUTPUT.PUT_LINE('Produsul '||rec_prod.codprodus||', '|| rec_prod.denprodus||', are stocul ' ||rec_prod.stoc); END LOOP; CLOSE c_prod; DBMS_OUTPUT.PUT_LINE('============'); END LOOP; CLOSE c_com; END; / Clauza FOR UPDATE

se blocheaz setul de nregistrri ale cursorului n 2 variante: NOWAIT i WAIT n:

CURSOR C IS SELECT .... FROM.... FOR UPDATE [OF COLUMN_NAME] [NOWAIT|WAIT n]; se adaug clauza FOR UPDATE n interogarea asociat cursorului pentru a bloca liniile afectate atunci cnd cursorul este deschis. clauza NOWAIT - determin apariia unei erori dac liniile sunt blocate de o alt sesiune. cnd mai multe tabele sunt implicate n interogare, se poate folosi FOR UPDATE pentru a impune blocarea liniilor unei tabele anume. Liniile unei tabele sunt blocate numai n cazul n care clauza FOR UPDATE face o referire la o coloan din acea tabel.

Exemplu: -- Se creeaz tabela Situatie care pastreaza informatii despre comenzi: codul, valoarea comenzii; -- Se adauga tabelei Situatie campul Tva, care va pstra valoarea TVA pentru fiecare comand; -- Se creeaz un cursor cruia i se adaug clauza FOR UPDATE pentru a bloca liniile afectate din tabel, atunci cnd cursorul este deschis; -- Pentru fiecare comand din cursor se va calcula valoarea TVA. DROP TABLE situatie; CREATE TABLE situatie AS SELECT c.nrcom cod, SUM(r.cant*r.pret) as valoare FROM comenzi c, rindcom r
3

Facultatea de Cibernetic, Statistic i Informatic Economic SGBD Oracle seminarul 7

WHERE c.nrcom=r.nrcom GROUP BY c.nrcom; ALTER TABLE situatie ADD(tva NUMBER(10)); DECLARE CURSOR c_situatie IS SELECT cod, valoare, tva FROM situatie FOR UPDATE OF tva NOWAIT; BEGIN FOR rec_situatie IN c_situatie LOOP UPDATE situatie SET tva=valoare*0.16 WHERE cod=rec_situatie.cod; DBMS_OUTPUT.PUT_LINE('Comanda '||rec_situatie.cod||' are valoarea totala de '|| rec_situatie.valoare||' RON si tva de: '||rec_situatie.tva ); END LOOP; END; / SELECT * FROM situatie; Utilizarea clauzei WHERE CURRENT OF pentru comenzi DML (UPDATE/DELETE) UPDATE tabela SET camp=.... WHERE CURRENT OF nume_cursor; se poate referi linia din tabela originar, pentru actualizare sau tergere, prin intermediul liniei curente a cursorului (cea procesat de ultima instruciune FETCH). clauza FOR UPDATE trebuie inclusa n definiia cursorului pentru a bloca liniile n momentul execuiei instruciunii OPEN.

Exemplu: -- Se creeaz tabela Situatie care pastreaza informatii despre comenzi: codul, valoarea comenzii; -- Se adauga tabelei Situatie campul Tva, care va pstra valoarea TVA pentru fiecare comand; -- Se creeaz un cursor cruia i se adaug clauza FOR UPDATE pentru a bloca liniile afectate din tabel, atunci cnd cursorul este deschis; -- Pentru fiecare comand din cursor se va calcula valoarea TVA, modificndu-se valoarea cmpului Tva prin intermediul cursorului. DROP TABLE situatie; CREATE TABLE situatie AS SELECT c.nrcom cod, SUM(r.cant*r.pret) as valoare FROM comenzi c, rindcom r
4

Facultatea de Cibernetic, Statistic i Informatic Economic SGBD Oracle seminarul 7

WHERE c.nrcom=r.nrcom GROUP BY c.nrcom; ALTER TABLE situatie ADD(tva NUMBER(10)); DECLARE CURSOR c_situatie IS SELECT cod, valoare, tva FROM situatie FOR UPDATE OF tva NOWAIT; BEGIN FOR rec_situatie IN c_situatie LOOP UPDATE situatie SET tva=valoare*0.16 WHERE CURRENT OF c_situatie; DBMS_OUTPUT.PUT_LINE('Comanda '||rec_situatie.cod||' are valoarea totala de '|| rec_situatie.valoare||' RON si tva de: '||rec_situatie.tva ); END LOOP; END; / SELECT * FROM situatie; Exerciii: 1. Afiai toi agenii i comenzile ncheiate de fiecare dintre acetia. Folosii un cursor pentru a ncrca numele agenilor i un cursor parametrizat pentru ncrcarea comenzilor ncheiate de acei ageni. 2. Afiai informaii despre primele 3 comenzi care au cea mai mare valoare. 3. Afiai informaii despre primii 3 ageni angajai (se va realiza filtrarea n funcie de cmpul DataAng).

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

  • Instalare Oracle 10g Pe Vista
    Instalare Oracle 10g Pe Vista
    Document11 pagini
    Instalare Oracle 10g Pe Vista
    Badescu Viorel
    Încă nu există evaluări
  • Seminar 6
    Seminar 6
    Document7 pagini
    Seminar 6
    Badescu Viorel
    Încă nu există evaluări
  • Subprograme PL/SQL
    Subprograme PL/SQL
    Document7 pagini
    Subprograme PL/SQL
    Georgiana Florentina Spiridon
    Încă nu există evaluări
  • Seminar 4
    Seminar 4
    Document5 pagini
    Seminar 4
    Badescu Viorel
    Încă nu există evaluări
  • Seminar 5
    Seminar 5
    Document6 pagini
    Seminar 5
    Badescu Viorel
    Încă nu există evaluări
  • Seminar 3
    Seminar 3
    Document10 pagini
    Seminar 3
    Badescu Viorel
    Încă nu există evaluări
  • Seminar 2
    Seminar 2
    Document12 pagini
    Seminar 2
    Badescu Viorel
    Încă nu există evaluări
  • SGBD
    SGBD
    Document5 pagini
    SGBD
    Badescu Viorel
    Încă nu există evaluări