Sunteți pe pagina 1din 4

/*1.

Construiți procedura Valoare_comenzi care să calculeze și să afișeze valoarea fiecărei

comenzi încheiate într-un an indicat ca parametru de intrare. Apelați procedura.*/

CREATE OR REPLACE PROCEDURE valoare_comenzi

(p_an NUMBER)

AS

CURSOR c IS SELECT c.id_comanda, data, SUM(cantitate*pret) AS valoare

FROM comenzi c, rand_comenzi r

WHERE c.id_comanda=r.id_comanda

AND EXTRACT (YEAR FROM data)=p_an

GROUP BY c.id_comanda, data;

BEGIN

FOR v IN c LOOP

DBMS_OUTPUT.PUT_LINE(v.id_comanda||'-'||v.valoare);

END LOOP;

END;

SET SERVEROUTPUT ON

EXECUTE VALOARE_COMENZI(2018)

/*2. Construiți funcția Calcul_varsta_client care să returneze varsta clientului al cărui id este

dat ca parametru de intrare. Tratați cazul în care clientul indicat nu există.*/

CREATE OR REPLACE FUNCTION calcul_varsta_client(p_id clienti.id_client%TYPE)

RETURN NUMBER

AS

v_varsta NUMBER;

BEGIN

SELECT ROUND((SYSDATE-data_nastere)/365)

INTO v_varsta

FROM clienti

WHERE id_client=p_id;
RETURN v_varsta;

EXCEPTION

WHEN NO_DATA_FOUND THEN RETURN -1;

END;

--apel

DECLARE

v_varsta NUMBER;

BEGIN

v_varsta := calcul_varsta_client(101);

IF v_varsta = -1 THEN DBMS_OUTPUT.PUT_LINE('Nu exista clientul');

ELSE DBMS_OUTPUT.PUT_LINE(v_varsta);

END IF;

END;

/*3. Apelați funcția calcul_varsta_client în cadrul unei proceduri, Afisare_clienti, prin care se

vor parcurge toți clienții, în scopul afișării vârstei fiecăruia.*/

CREATE OR REPLACE PROCEDURE afisare_clienti

AS

CURSOR c IS SELECT id_client, nume_client

FROM clienti;

v_id clienti.id_client%TYPE;

v_nume clienti.nume_client%TYPE;

v_varsta NUMBER;

BEGIN

OPEN c;

LOOP

FETCH c INTO v_id, v_nume;

EXIT WHEN c%NOTFOUND;

v_varsta:=calcul_varsta_client(v_id);
DBMS_OUTPUT.PUT_LINE(v_nume||' are varsta '||v_varsta);

END LOOP;

CLOSE c;

END;

EXECUTE afisare_clienti;

/*4. Creaţi procedura Mareste_salariul prin care să se mărească cu o anumită valoare

salariul unui angajat. Valoarea cu care se face modificarea şi identificatorul angajatului vor fi

primite ca parametri.

Trataţi printr-o excepţie cazul în care nu există angajatul specificat (deci comanda de

actualizare nu va produce modificări).*/

CREATE OR REPLACE PROCEDURE mareste_salariul

(p_id NUMBER, p_val NUMBER)

AS

nu_exista_angajat EXCEPTION;

BEGIN

UPDATE angajati

SET salariul = salariul + p_val

WHERE id_angajat = p_id;

IF SQL%ROWCOUNT=0

THEN RAISE nu_exista_angajat;

ELSE DBMS_OUTPUT.PUT_LINE('ok');

END IF;

EXCEPTION

WHEN nu_exista_angajat THEN DBMS_OUTPUT.PUT_LINE('Nu exista angajatul');

END;

/
SET SERVEROUTPUT ON

EXECUTE mareste_salariul(100,10)

/*5. Creati functia Numar_ang care sa calculeze numarul de angajati din departamentul al

carui identificator este primit ca parametru.

Tratati prin exceptii cazul in care nu exista angajati in departamentul specificat, precum si pe

acela in care nu exista departamentul.*/

CREATE OR REPLACE FUNCTION numar_angajati(p_id NUMBER)

RETURN NUMBER

AS

BEGIN

SELECT id_departament INTO x

FROM departamente

WHERE id_departament=p_id;

SELECT COUNT(id_angajat) INTO v_nr

FROM angajati

WHERE id_departament=p_id;

END;

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