16 decembrie 2011

Exercitii noi PL/SQL

I. Tabela student {matricol, nume, grupa, medie, bursa} si tabela note {matricol, data, nota}
a) un trigger pt fiecare insert/update/delete in tabela note care va actualiza corespunzator tabela student cu media care reiese;
Apoi se vor insera note diverse.
b) o procedura stocata care acorda burse unui student luat ca parametru (matricol) a.i. pt fiecare nota de 7,8 => add 100 la bursa, pt fiecare nota 9, 10 => add 200 la bursa
c) de apelat procedura intr-un cursor pt toti studentii intr-o grupa  (grupa data de la tastatura)
d) afisare tabel {matricol, nume, grupa, medie, nr.note, bursa}
codul sursa AICI

II. Pachetul facultate care contine o functie bonus (cu parametru matricol) si intoarce o valoare egala cu 100*nr.notelor de 10. Pachetul mai are un cursor ce selecteaza studentii care au  cel putin 3 note de 10 si media peste 9. Folosind cursorul si functia definita, se adauga bonusul la valoarea bursei studentului care respecta toate aceste conditii. Exceptie: pt studentul cu bursa > 1000, tratare prin setarea bursei la 1000.

// creare tabele

create table note (
matricol number(3),
cod_materie number(3),
nota number(2)
);

create table studenti (

matricol number(3),
bursa number(3)
);

// interfata pachet


CREATE OR REPLACE PACKAGE facultate AS

FUNCTION bonus (mymatricol IN number) RETURN number;

CURSOR smart IS
select S.matricol from studenti S
where S.matricol IN (
select N.matricol from note N
where (select count (*) from note where nota = 10 AND matricol = N.matricol) > 2
) AND (
select avg(nota)
from note
where matricol = S.matricol
) >= 9;

bursa_mare EXCEPTION;

END;

// implementare pachet


CREATE OR REPLACE PACKAGE BODY facultate AS

FUNCTION bonus (mymatricol IN number) RETURN number IS
numar number;
begin
numar:=0;
select count(*) into numar
from note
where matricol=mymatricol AND nota=10;
return 100*numar;
end bonus;

END facultate;

// programul principal


declare
vc facultate.smart%ROWTYPE;
valoare number;

BEGIN

open facultate.smart;
LOOP BEGIN
fetch facultate.smart into vc;
exit when facultate.smart%NOTFOUND;

valoare := facultate.bonus(vc.matricol);
IF valoare>1000 THEN raise facultate.bursa_mare; END IF;

update studenti set bursa=bursa+valoare
where matricol=vc.matricol;

EXCEPTION WHEN facultate.bursa_mare
THEN update studenti set bursa=1000 where matricol=vc.matricol;

END;
END LOOP;
close facultate.smart;
END;