Sunteți pe pagina 1din 5

--1.

Sa se dubleze salariul angajatilor care au incheiat comenzi in anul 2009

--si sa se pastreze numele lor intr-o tabela indexata. Sa se afiseze valorile elementelor colectiei.

DECLARE

TYPE tab_indexata IS TABLE OF angajati.nume%TYPE INDEX BY PLS_INTEGER;

t tab_indexata;

BEGIN

UPDATE angajati

SET salariul = salariul*2

WHERE id_angajat IN (SELECT id_angajat FROM comenzi WHERE EXTRACT (YEAR FROM data) = 2009)

RETURNING nume BULK COLLECT INTO t;

FOR i IN t.FIRST .. t.LAST LOOP

DBMS_OUTPUT.PUT_LINE(t(i));

END LOOP;

END;

----2. Stocati intr-o colectie salariul mediu pentru fiecare departament.

--Afisati valorile elementelor colectiei.

DECLARE

TYPE date_departament IS RECORD

den_dep departamente.denumire_departament%TYPE,

sal_med NUMBER

);

TYPE tab_indexata IS TABLE OF date_departament INDEX BY PLS_INTEGER;

t tab_indexata;
BEGIN

SELECT denumire_departament, ROUND(AVG(salariul)) BULK COLLECT INTO t

FROM departamente JOIN angajati USING(id_departament)

GROUP BY denumire_departament;

FOR i IN t.FIRST .. t.LAST LOOP

DBMS_OUTPUT.PUT_LINE(t(i).den_dep||' ' ||t(i).sal_med);

END LOOP;

END;

--3. Realizaţi o funcție care să returneze valoarea comenzilor date de clientul indicat drept parametru

set serveroutput on

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

RETURN NUMBER

AS

v_valoare NUMBER;

BEGIN

SELECT sum(r.pret*r.cantitate)

INTO v_valoare

FROM clienti cl inner join comenzi c on cl.id_client=c.id_client

inner join rand_comenzi r on c.id_comanda=r.id_comanda

WHERE c.id_client=p_id;

IF v_valoare IS NULL

THEN return -1;

else

return v_valoare;
END IF;

END;

set serveroutput on

declare

v_valoare number;

begin

v_valoare:=Calcul_comenzi(12);

DBMS_OUTPUT.PUT_LINE(v_valoare);

end;

--4. Realizati o procedură care să afișeze topul primilor n clienți (identificați prin nume_client)

--ordonați descrescător în funcție de valoarea comenzilor proprii și procentul deținut de aceștia

--din valoarea totală a vânzărilor. n este indicat drept parametru.

CREATE OR REPLACE PROCEDURE top_clienti(n NUMBER ) AS

CURSOR c IS SELECT nume_client ,Calcul_comenzi(id_client) val_comenzi ---


CA SA MI AFISEZE PE MAI MULTE LINII FOLOSIM CURSOR

FROM clienti

ORDER BY val_comenzi DESC

FETCH FIRST n ROWS ONLY ;

v_total NUMBER;

BEGIN

SELECT SUM (pret*cantitate ) INTO v_total FROM rand_comenzi;

FOR v IN c LOOP

DBMS_OUTPUT.PUT_LINE(v.nume_client||'a dat comenzi in valoare de '||v.val_comenzi ||' ,adica


'||ROUND(v.val_comenzi*100/v_total)||'% din total vanzari '); --metoda de a deschid eun cursor
mai usor

END LOOP ;
END;

execute top_clienti(5);

--5. Construiţi un pachet care să conţină:

--** o procedură care returnează numele, vechimea și venitul total (salariu + comision) pentru angajatul
al cărui id este dat ca parametru;

--** o procedură care mărește cu 2 salariul angajatului al cărui id este dat ca parametru.

--În ambele proceduri de mai sus, să se verifice situația în care angajatul indicat nu există (invocând o
excepție în acest caz) prin apelul unei funcții private, creată în acest scop.

--Să se apeleze procedurile din cadrul pachetului.

CREATE OR REPLACE PACKAGE s9 AS

PROCEDURE afiseaza_ang (p_id NUMBER);--PRIMA PROCEDURA

PROCEDURE modifica_salariu (p_id NUMBER);--A DOUA PROCEDURA

END;

CREATE OR REPLACE PACKAGE BODY s9 AS

FUNCTION verifica_existenta(p_id NUMBER) RETURN BOOLEAN AS


BEGIN

SELECT id_angajat INTO x

FROM angajati

WHERE id_angajat=p_id;

RETURN TRUE;

EXCEPTION

WHEN NO_DATA_FOUND THEN RETURN FALSE;

END;

PROCEDURE afiseaza_ang (p_id NUMBER) AS

BEGIN

NULL;

END;

PROCEDURE modifica_salariu (p_id NUMBER) AS

BEGIN

NULL;

END;

END;

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