Sunteți pe pagina 1din 5

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).
DECLARE
v_id comenzi.id_comanda%TYPE;
v_data comenzi.data%TYPE;
v_an NUMBER(4) := &an;

prea_multe EXCEPTION;
PRAGMA EXCEPTION_INIT(prea_multe, -01422);
BEGIN
SELECT id_comanda, data
INTO v_id, v_data
FROM comenzi
WHERE EXTRACT(YEAR FROM data) = v_an;

DBMS_OUTPUT.PUT_LINE('Comanda: ' || v_id || ' ' || v_data);


EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Nu exista comenzi in anul ' || v_an);

WHEN prea_multe THEN


DBMS_OUTPUT.PUT_LINE('Prea multe comenzi in anul ' || v_an);
FOR v_rec IN (SELECT id_comanda, data
FROM comenzi
WHERE EXTRACT(YEAR FROM data) = v_an) LOOP
DBMS_OUTPUT.PUT_LINE('Comanda: ' || v_rec.id_comanda || ' ' ||
v_rec.data);
END LOOP;
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.
DECLARE
v_id produse.id_produs%TYPE := &id;
nu_exista_produsul EXCEPTION;
BEGIN
UPDATE produse
SET pret_lista = pret_lista * 2
WHERE id_produs = v_id;

IF SQL%NOTFOUND THEN
RAISE nu_exista_produsul;
ELSE
DBMS_OUTPUT.PUT_LINE('S-a produs update-ul');
END IF;
EXCEPTION
WHEN nu_exista_produsul THEN
DBMS_OUTPUT.PUT_LINE('Nu exista produsul');
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.
DECLARE
v_prod_id produse.id_produs%TYPE := &id;
v_denumire produse.denumire_produs%TYPE;
v_cantitate NUMBER;
produs_necomandat EXCEPTION;
BEGIN
SELECT denumire_produs
INTO v_denumire
FROM produse
WHERE id_produs = v_prod_id;

DBMS_OUTPUT.PUT_LINE('Produs ' || v_denumire);

SELECT NVL(SUM(cantitate), 0)
INTO v_cantitate
FROM rand_comenzi
WHERE id_produs = v_prod_id;

IF v_cantitate = 0 THEN
RAISE produs_necomandat;
ELSE
DBMS_OUTPUT.PUT_LINE('Cantitate ' || v_cantitate);
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Produsul nu exista');
WHEN produs_necomandat THEN
DBMS_OUTPUT.PUT_LINE('Produsul nu a fost comandat');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
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.
DECLARE
v_id departamente.id_departament%TYPE := &id;
v_counter NUMBER;
CURSOR c_angajat (id_param angajati.id_departament%TYPE) IS (
SELECT nume, salariul, ROUND((SYSDATE - data_angajare) / 365, 2)
FROM angajati
WHERE id_departament = id_param
);
v_cursor c_angajat%ROWTYPE;

nu_exista_dep EXCEPTION;
nu_are_angajati EXCEPTION;
BEGIN
BEGIN
SELECT COUNT(id_departament) INTO v_counter
FROM departamente
WHERE id_departament = v_id;

IF v_counter = 1 THEN
OPEN c_angajat(v_id);

LOOP
FETCH c_angajat INTO v_cursor;
EXIT WHEN c_angajat%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Angajat ' || v_cursor.nume);
END LOOP;

IF c_angajat%ROWCOUNT = 0 THEN
RAISE nu_are_angajati;
END IF;

DBMS_OUTPUT.PUT_LINE('TOTAL: ' || c_angajat%ROWCOUNT);


CLOSE c_angajat;
ELSE
RAISE nu_exista_dep;
END IF;
END;

EXCEPTION
WHEN nu_exista_dep THEN
DBMS_OUTPUT.PUT_LINE('Nu exista departamentul');
WHEN nu_are_angajati THEN
DBMS_OUTPUT.PUT_LINE('Nu exista angajati in departamentul
specificat');
END;

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