Sunteți pe pagina 1din 7

1.

 Creaţi un bloc PL/SQL pentru a selecta codul și data de încheiere a comenzilor încheiate
într-un an introdus de la tastatură (prin comandă SELECT simplă, fără să utilizați un cursor
explicit).

 dacă interogarea returnează mai mult de o valoare pentru codul comenzii, tratați
excepția cu o rutină de tratare corespunzătoare și afișați mesajul “Atenţie! In anul
yyyy s-au încheiat mai multe comenzi!”;
 dacă interogarea nu returnează nicio valoare pentru codul comenzii, tratați excepția
cu o rutină de tratare corespunzătoare și afișați mesajul “Atenţie! In anul yyyy nu s-au
încheiat comenzi!”;
 dacă se returnează o singură linie, afișați codul și data comenzii;
 tratați orice altă excepție cu o rutină de tratare corespunzătoare și afișați mesajul “A
apărut o altă excepție!”.

--testati cu anul 2015 (o singura comanda) => se face afisarea din zona executabila
(comanda SELECT intoarce un singur rezultat)
--testati cu anul 2019 (mai multe comenzi) => SELECT returneaza mai multe linii =>
TOO_MANY_ROWS
--testati cu anul 2000 (nicio comanda) => SELECT nu returneaza nimic =>
NO_DATA_FOUND

SET SERVEROUTPUT ON

DECLARE

v_id comenzi.id_comanda%TYPE;

v_data comenzi.data%TYPE;

v_an NUMBER := &an;

BEGIN

SELECT id_comanda, data INTO v_id, v_data

FROM COMENZI

WHERE EXTRACT(YEAR FROM data)= v_an;


DBMS_OUTPUT.PUT_LINE(v_id||' ' ||v_data); --2015

EXCEPTION

WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('In anul ' ||v_an||' NU sunt


comenzi'); --2000

WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE('In anul ' ||v_an||' sunt prea


multe comenzi'); --2018

WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Alta eroare ');

END;

---pentru erori predefinite

DECLARE

v_id comenzi.id_comanda%TYPE;

v_data comenzi.data%TYPE;

v_an NUMBER := &an;

prea_multe_comenzi EXCEPTION;

PRAGMA EXCEPTION_INIT(prea_multe_comenzi,-01422);

BEGIN

SELECT id_comanda, data INTO v_id, v_data

FROM COMENZI
WHERE EXTRACT(YEAR FROM data)= v_an;

DBMS_OUTPUT.PUT_LINE(v_id||' ' ||v_data); --2015

EXCEPTION

WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('In anul ' ||v_an||' NU sunt


comenzi'); --2000

--WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE('In anul ' ||v_an||' sunt prea


multe comenzi'); --2018

WHEN prea_multe_comenzi THEN DBMS_OUTPUT.PUT_LINE('In anul ' ||v_an||' sunt prea


multe comenzi'); --2018

WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Alta eroare '||SQLERRM);

END;

2. Creaţi un bloc PL/SQL prin care se dublează preţul produsului (pret_lista) al cărui cod este
citit de la tastatură. În cazul în care acesta nu există (comanda UPDATE nu realizează nicio
modificare) se va invoca o excepție. Tratați excepția prin afișarea unui mesaj.

--testati cu id produs 3061 pentru a obtine modificari prin UPDATE => se produce


modificarea si se face afisarea din zona executabila
--testati cu id produs 100 pentru a nu obtine modificari prin UPDATE => se invoca exceptia
definita de utilizator => se afiseaza mesajul din Exception

DECLARE

v_id produse.id_produs%TYPE := &id; -- pt APEX v_id produse.id_produs%TYPE := :id;

nu_exista_produs EXCEPTION;

BEGIN

UPDATE produse
SET pret_lista=2*pret_lista

WHERE id_produs=v_id;

IF SQL%ROWCOUNT=0 THEN

RAISE nu_exista_produs;

ELSE

DBMS_OUTPUT.PUT_LINE('Modificare efectuata');

END IF;

EXCEPTION

WHEN nu_exista_produs THEN DBMS_OUTPUT.PUT_LINE('Nu exista produsul '||v_id);

END;

3. Într-un bloc PL/SQL citiți de la tastatură identificatorul unui produs. Afișați denumirea
produsului care are acel cod. De asemenea, calculați cantitatea totală comandată din acel
produs.

 afișați denumirea produsului;


 dacă produsul nu există, tratați excepția cu o rutină de tratare corespunzătoare;
 dacă produsul nu a fost comandat, invocați o excepție, care se va trata
corespunzător;
 dacă produsul există și a fost comandat, afișați cantitatea totală comandată;
 tratați orice altă excepție cu o rutină de tratare corespunzătoare.

--testati cu id produs 3061 (nu a fost comandat) => se invoca exceptia definita de utilizator


=> se afiseaza mesajul din Exception
--testati cu id produs 2311 (a fost comandat) => se afiseaza mesajul din zona executabila
--testati cu id produs 100 (nu exista) => NO_DATA_FOUND
DECLARE

v_id produse.id_produs%TYPE := &id; -- pt APEX v_id produse.id_produs%TYPE := :id;

v_den produse.denumire_produs%TYPE;

v_cant NUMBER;

produs_necomandat EXCEPTION ;

BEGIN

SELECT denumire_produs INTO v_den

FROM produse

WHERE id_produs =v_id;

DBMS_OUTPUT.PUT_LINE('produs :'|| v_den );

SELECT SUM(cantitate) INTO v_cant

FROM rand_comenzi

WHERE id_produs =v_id ;

IF V_CANT IS NULL

THEN RAISE produs_necomandat ;

else

DBMS_OUTPUT.PUT_LINE('Cantitate totala :'|| v_cant ); --1797 produs comandat


END IF;

EXCEPTION

WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('Nu exista produsul ' );

WHEN produs_necomandat THEN DBMS_OUTPUT.PUT_LINE('Produsul nu a fost


comandat' );

END;

4. Într-un bloc PL/SQL utilizați un cursor parametrizat pentru a prelua numele, salariul și
vechimea angajaților dintr-un departament furnizat drept parametru.

 deschideți cursorul prin indicarea ca parametru a unei variabile de substituție, a cărei


valoare să fie citită de la tastatură;
 parcurgeți cursorul și afișați informațiile solicitate pentru acei angajați care fac parte
din departamentul indicat;
 afișați numărul total de angajați parcurși;
 în cazul în care nu există departamentul indicat, se va invoca o excepție, care se va
trata corespunzător;
 în cazul în care nu există angajați în departamentul indicat, se va invoca o excepție,
care se va trata corespunzător.

--testati cu id departament 7 pentru a verifica lipsa departamentului  => se invocă excepție


--testati cu id departament 210 pentru a nu obtine niciun rezultat  => SELECT nu returneaza
nimic, deci cursorul indica o zona goala de memorie => nu se face nicio parcurgere
--testati cu id departament 50 pentru a obtine mai multe rezultate => se efectueaza
parcurgerile asupra setului de date adus in memorie

DECLARE

cursor c (p_id NUMBER) is SELECT nume, salariul , round((SYSDATE-data_angajare)/365,2) as vechime

from angajati

where id_departament=p_id;
v_id NUMBER := &id;

v_rec c%ROWTYPE;

BEGIN

open c(v_id);

loop

fetch c INTO v_rec;

exit when c%notfound;

DBMS_OUTPUT.PUT_LINE('Nume '||v_rec.nume ||' are vechimea '||v_rec.vechime);

end loop;

close c;

END;

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