P. 1
Seminar 7

Seminar 7

|Views: 1|Likes:
Published by Badescu Viorel

More info:

Published by: Badescu Viorel on Feb 07, 2013
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as DOC, PDF, TXT or read online from Scribd
See more
See less

01/04/2015

pdf

text

original

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, încărcarea şi închiderea cursorului. Exemplu: --Să se afişeze 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 funcţionalitate 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 afişeze produsele al căror stoc este mai mare decât o valoare primită drept parametru. SET SERVEROUTPUT ON DECLARE
1

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

rindcom r 3 .denprodus||'. -.nrcom ||' incheiata la data de '|| rec_com.  când mai multe tabele sunt implicate în interogare. Statistică şi Informatică Economică SGBD Oracle – seminarul 7 BEGIN OPEN c_com.stoc). DBMS_OUTPUT. END..Pentru fiecare comandă din cursor se va calcula valoarea TVA..codprodus||'. se poate folosi FOR UPDATE pentru a impune blocarea liniilor unei tabele anume. / Clauza FOR UPDATE  se blochează setul de înregistrări ale cursorului în 2 variante: NOWAIT şi WAIT n: CURSOR C IS SELECT . DROP TABLE situatie. CREATE TABLE situatie AS SELECT c. atunci când cursorul este deschis.determină apariţia unei erori dacă liniile sunt blocate de o altă sesiune.cant*r..Facultatea de Cibernetică. END LOOP.. -. EXIT WHEN c_prod%notfound. DBMS_OUTPUT.  Exemplu: -. care va păstra valoarea TVA pentru fiecare comandă.nrcom cod. FROM.pret) as valoare FROM comenzi c. are stocul ' ||rec_prod. valoarea comenzii. DBMS_OUTPUT. EXIT WHEN c_com%notfound. se adaugă clauza FOR UPDATE în interogarea asociată cursorului pentru a bloca liniile afectate atunci când cursorul este deschis. LOOP FETCH c_com into rec_com.Se adauga tabelei Situatie campul Tva.data). CLOSE c_com.Se creează un cursor căruia i se adaugă clauza FOR UPDATE pentru a bloca liniile afectate din tabelă. OPEN c_prod (rec_com. -. CLOSE c_prod. END LOOP.PUT_LINE('Produsul '||rec_prod.PUT_LINE('============'). SUM(r.PUT_LINE('Comanda '|| rec_com.  clauza NOWAIT . --cursorul primeste drept parametru numarul comenzii care a fost afisata LOOP FETCH c_prod into rec_prod.nrcom).Se creează tabela Situatie care pastreaza informatii despre comenzi: codul. FOR UPDATE [OF COLUMN_NAME] [NOWAIT|WAIT n].. '|| rec_prod.. Liniile unei tabele sunt blocate numai în cazul în care clauza FOR UPDATE face o referire la o coloană din acea tabelă.

nrcom cod.cod||' are valoarea totala de '|| rec_situatie.nrcom=r.cant*r.Se creează un cursor căruia i se adaugă clauza FOR UPDATE pentru a bloca liniile afectate din tabelă. END. ALTER TABLE situatie ADD(tva NUMBER(10)).Facultatea de Cibernetică. DROP TABLE situatie. Statistică şi Informatică Economică SGBD Oracle – seminarul 7 WHERE c. rindcom r 4 . WHERE CURRENT OF nume_cursor. BEGIN FOR rec_situatie IN c_situatie LOOP UPDATE situatie SET tva=valoare*0.  clauza FOR UPDATE trebuie inclusa în definiţia cursorului pentru a bloca liniile în momentul execuţiei instrucţiunii OPEN. DECLARE CURSOR c_situatie IS SELECT cod. tva FROM situatie FOR UPDATE OF tva NOWAIT. care va păstra valoarea TVA pentru fiecare comandă.tva ). -. pentru actualizare sau ştergere..nrcom GROUP BY c. / SELECT * FROM situatie. atunci când cursorul este deschis. -.  Exemplu: -..Se adauga tabelei Situatie campul Tva.valoare||' RON si tva de: '||rec_situatie. -. modificându-se valoarea câmpului Tva prin intermediul cursorului. Utilizarea clauzei WHERE CURRENT OF pentru comenzi DML (UPDATE/DELETE) UPDATE tabela SET camp=.. END LOOP.Pentru fiecare comandă din cursor se va calcula valoarea TVA. SUM(r. CREATE TABLE situatie AS SELECT c.cod.nrcom. valoare.pret) as valoare FROM comenzi c.Se creează tabela Situatie care pastreaza informatii despre comenzi: codul. DBMS_OUTPUT.PUT_LINE('Comanda '||rec_situatie.16 WHERE cod=rec_situatie. se poate referi linia din tabela originară. prin intermediul liniei curente a cursorului (cea procesată de ultima instrucţiune FETCH). valoarea comenzii.

Folosiţi un cursor pentru a încărca numele agenţilor şi un cursor parametrizat pentru încărcarea comenzilor încheiate de acei agenţi.Facultatea de Cibernetică.tva ). 3.nrcom=r. END LOOP. Afişaţi informaţii despre primii 3 agenţi angajaţi (se va realiza filtrarea în funcţie de câmpul DataAng). tva FROM situatie FOR UPDATE OF tva NOWAIT. DBMS_OUTPUT. 5 . valoare. Afişaţi informaţii despre primele 3 comenzi care au cea mai mare valoare.16 WHERE CURRENT OF c_situatie. Statistică şi Informatică Economică SGBD Oracle – seminarul 7 WHERE c. END.nrcom. 2. ALTER TABLE situatie ADD(tva NUMBER(10)). / SELECT * FROM situatie.cod||' are valoarea totala de '|| rec_situatie. Afişaţi toţi agenţii şi comenzile încheiate de fiecare dintre aceştia. DECLARE CURSOR c_situatie IS SELECT cod.valoare||' RON si tva de: '||rec_situatie. BEGIN FOR rec_situatie IN c_situatie LOOP UPDATE situatie SET tva=valoare*0.nrcom GROUP BY c.PUT_LINE('Comanda '||rec_situatie. Exerciţii: 1.

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->