Sunteți pe pagina 1din 24

ACADEMIA DE STUDII ECONOMICE, BUCURESTI FACULTATEA DE CIBERNETICA, STATISTICA SI INFORMATICA ECONOMICA

PROIECT SGBD

Bratosin Alexandru GRUPA 1033 SERIA C

CUPRINS

PROIECT SGBD.................................................................................................................1 B. Interaciunea cu serverul Oracle prin intermediul comenzilor SQL (LDD i LMD) ................................................................................................................................7 C. Structuri alternative i repetitive.......................................................................8 E. Gestionarea cursorilor: implicii i explicii....................................................12 F. Funcii, proceduri, includerea acestora n pachete..........................................15 G. Declansatori.....................................................................................................23

..............................................................................................................................24

A. Descrierea problemei, crearea tabelelor, prezentarea schemei conceptuale a tabelelor si inserarea in tabele.

create table Casete( nr_inventar number(5) primary key, cod_film number(5), data_intrarii date, nr_inchirieri number(5)); create table Filme( cod_film number(5) primary key, gen varchar2(60), titlu varchar2(60), reg varchar2(60), an number(5), act_p varchar2(60)), constraint cod_filme_fk foreign key(cod_film) references Casete; create table Clienti( cod_client number(5) primary key, nume varchar2(60), prenume varchar2(60), adresa varchar2(60), nr_telefon number(10), calificativ varchar2(20)); create table Inchirieri( cod_client number(5), nr_inventar number(5), data_inchirierii date, data_returnarii date), constraint cod_client_fk foreign key(cod_client) references Clienti, constraint nr_inventar_fk foreign key(nr_inventar) references Casete;

CASETE NR_INVENTAR FILME COD_FILM GEN TITLU REGIZOR AN ACTOR PRINCIPAl COD_FILME DATA_INTRARII NR_INCHIRIERI

CLIENTI COD_CLIENT INCHIRIERI COD_CLIENT NR_INVENTAR DATA_INCHIRIERII DATA_RETURNARII NUME PRENUME ADRESA NR_TEL CALIFICATIV

insert insert insert insert insert

into into into into into

casete casete casete casete casete

values('2','11',to_date('10 03 2007','dd mm yyyy'),'100'); values('1','1',to_date('31 01 2007','dd mm yyyy'),'5'); values('3','21',to_date('25 05 2007','dd mm yyyy'),'50'); values('4','50',to_date('30 12 2007','dd mm yyyy'),'50'); values('5','121',to_date('6 01 2008','dd mm yyyy'),'300');

insert into filme values('1','Actiune','TREI SUTE','Zack Snyder','2006','Gerard Butler'); insert into filme values('2','SF','ALEINV vs PREDATOR 2','Colin Strause','2007','Steven Pasquale '); insert into filme values('3','Comedie','DR.DOLITTLE','Rich Thorne','2006','Eddie Murphy '); insert into filme values('4','Actiune','The Lord of the Rings: The Return of the King','Peter Jackson','2003','Noel Appleby'); insert into filme values('5','Comedie','Big Mommas House 2','John Whitesell','2006','Martin Lawrence'); insert into clienti values('11','Mihai','Samoila','Calea florilor nr 4','0741589713','Bun'); insert into clienti values('31','Elena','Diaconu','Mosilor nr 19','0743035772','Satisfacator'); insert into clienti values('25','Dana','Macsim','Independentei 5','0745895772','Buna'); insert into clienti values('36','Florin','Petre','Crizantemei 5','0745897572','Proasta'); insert into clienti values('50','George','Prisac','Unirii 20','0745897527','Proasta'); insert into inchirieri values('11','1',to_date('01 03 2008','dd mm yyyy'),to_date('08 03 2008','dd mm yyyy')); insert into inchirieri values('50','2',to_date('21 03 2008','dd mm yyyy'),to_date('28 03 2008','dd mm yyyy')); insert into inchirieri values('36','5',to_date('21 02 2008','dd mm yyyy'),to_date('29 02 2008','dd mm yyyy')); insert into inchirieri values('25','4',to_date('13 02 2008','dd mm yyyy'),to_date('20 02 2008','dd mm yyyy')); insert into inchirieri values('31','2',to_date('05 04 2008','dd mm yyyy'),to_date('12 04 2008','dd mm yyyy'));

B. Interaciunea cu serverul Oracle prin intermediul comenzilor SQL (LDD i LMD)


-1. Sa se modifice tabela Casete, introducand-se coloana nr_copii varchar2(30)
SET SERVEROUTPUT ON begin execute immediate 'alter table casete add(nr_copii varchar2(30))'; end; / select * from casete; -2. Sa se stearga filmul cu codul 2. DECLARE v_nrcod filme.cod_film%TYPE := 2; BEGIN DELETE FROM filme WHERE cod_film = v_nrcod; END; / select * from filme; -3. Sa se modifice tabela Casete astfel: nr_copii number(2). SET SERVEROUTPUT ON declare sir varchar2(200); begin sir:='alter table casete modify(nr_copii number(2))'; execute immediate sir; end; / select * from casete; -4. Sa se introduca o noua caset, in tabela casete pt aceasta caseta sunt disponibile 12 copii . begin insert into casete(nr_inventar, cod_film, data_intrarii, nr_inchirieri,nr_copii) values(6,22,to_date('11 03 2008','dd mm yyyy'),0,12 ); end; / select * from casete; -5. Sa se actualizeze nr de copii pt casetele care au nr_inventar =1,2,3,4,5 la 10;

BEGIN update casete set nr_copii=10 where nr_inventar in(1,2,3,4,5); END; / select * from casete; -6. Selectati si afisati nr maxim de inchirieri. SET SERVEROUTPUT ON declare v_nr casete.nr_inchirieri%type; begin select max(nr_inchirieri) into v_cantitate from comenzi DBMS_OUTPUT.PUT_LINE('Nr max de inchirieri este '||v_nr||' buc.'); end; /

C. Structuri alternative i repetitive.


-1. Sa se afiseze pe ecran nr de copii pt filmul cu codul 21, iar daca nr este mai mic decat 10, sa se afiseze mesajul "stoc insuficient", daca este mai mare de 20, sa se afiseze "peste medie", altfel "stocul este suficient". SET SERVEROUTPUT ON DECLARE v_nr_copii casete.nr_copii%type; BEGIN SELECT nr_copii into v_nr_copii from casete where cod_film =21; dbms_output.put_line('Nr de copii pt filmul cerut este '||v_nr_copii); IF v_nr_copii < 10 THEN dbms_output.put_line('Stoc insuficient'); ELSIF v_nr_copii between 10 and 25 THEN dbms_output.put_line('Stocul este suficient'); ELSE dbms_output.put_line('Peste medie'); END IF; end; / -2. Afisati nr de copii necesare pr filmul cu codul 21 stiind ca nr de copii se calculeaza astfel daca nr de inchirieri sub 50 nr necesar 5% ,intre 50 si 100 nr necesar 7% peste 100 nr necesar 10% din nr de inchirieri ,in cazut ca un film nu a fost inchiriat deloc nr necesar este 0 . SET SERVEROUTPUT ON DECLARE v_nr casete.nr_inchirieri%type; v_nr_copii casete.nr_copii%type; v_necesar number(15); BEGIN select nr_inchirieri into v_nr from casete where cod_film=21; select nr_copii into v_nr_copii from casete where cod_film=21; v_necesar:=

case when v_nr between 0 and 50 then 5 when v_nr between 50 and 100 then 7 when v_nr>100 then 10 else 0 end; v_nr :=v_nr*v_necesar/100; dbms_output.put_line('Nr necesar este : '||v_nr); end;/

-3. Folositi o structura loop-endloop pentru a afisa nr mediu de inchirieri si codurile primelor 3 filme care au nr de inchirieri mai mic decat media. SET SERVEROUTPUT ON DECLARE v_nr casete.nr_inchirieri%type; v_nrmediu v_nr%type; i number(4):=1; BEGIN select avg(nr_inchirieri) into v_nrmediu from casete; dbms_output.put_line('Nr mediu de inchirieri este: '||v_nrmediu); loop select nr_inchirieri into v_nr from casete where nr_inventar=i; dbms_output.put_line('caseta cu nr de inventar '||i||' are nr de inchirieri: '||v_nr); i:=i+1; exit when v_nr>v_nrmediu or i>5; end loop; END; / -4. Pentru toate casetele , sa se mareasca stocul cu 5 procente. set serveroutput on DECLARE nr casete.nr_inventar%type; copii casete.nr_copii%type; cursor c1 is select nr_copii from casete; i number(2); BEGIN select count(nr_inventar) into nr from casete; open c1; for i in 1..nr loop fetch c1 into copii; copii:=copii*1.05; exit when nr<0 or c1%notfound; dbms_output.put_line('Pt caseta '||i||' i sa marit stocul la '||copii); end loop; END;

-5. Sa se afiseze codul clientilor adresa si calificativul. set serveroutput on DECLARE nr clienti.cod_client%type; adresa clienti.adresa%type; cal clienti.calificativ%type; cursor c1 is select cod_client,adresa,calificativ from clienti; i number(2):=1; BEGIN select count(cod_client) into nr from clienti; open c1; while nr>0 loop i:=i+1; fetch c1 into nr,adresa,cal; exit when c1%notfound; dbms_output.put_line('Clintul '||i||'- cu codul '||nr||' are adresa '||adresa||'si calificativul'|| cal); end loop; END; /

D. Tratarea excepiilor
-1. Sa se afiseze numele filmului care are ca regizor pe Zack Snyder. Daca nu exista nici unul cu acest regizor, sa se afiseze mesajul Nu exista nici un film cu acest regizor. Daca sunt mai multe filme cu acest regizor, sa se afiseze mesajul Exista mai multe filme cu regizorul Zack Snyder. SET SERVEROUTPUT ON DECLARE v_nume filme.titlu%type; BEGIN SELECT titlu INTO v_nume FROM filme WHERE reg='Zack Snyder'; dbms_output.put_line('Titlul flimului cu regizorul Zack Snyder este '||v_nume); EXCEPTION WHEN no_data_found THEN dbms_output.put_line('Nu exista nici un regizor cu numele Zack Snyder '); WHEN too_many_rows THEN dbms_output.put_line('Exista mai multe filme cu acest regizor'); END; /

-2. Sa se stearga datele din tabela clienti. Daca datele nu pot fi sterse, invocati o exceptie.

10

DECLARE e_except EXCEPTION; PRAGMA EXCEPTION_INIT(e_except, -2292); BEGIN DELETE FROM clienti; EXCEPTION WHEN e_except THEN dbms_output.put_line('Nu puteti sterge clientul'); dbms_output.put_line('Exista comenzi asignate lui'); END; / -3. Sa se afiseze codul filmului si stocul acestuia. Daca stocul este 0, invocati o exceptie. SET SERVEROUTPUT ON DECLARE stoc_zero EXCEPTION; cursor c1 is select cod_film,nr_copii from casete; v_stoc casete.nr_copii%type; v_cod casete.cod_film%type; BEGIN open c1; loop fetch c1 into v_cod, v_stoc; IF v_stoc=0 THEN RAISE Stoc_zero; ELSE dbms_output.put_line('filmul:' || v_cod||' are stocul '||v_stoc); END IF; EXIT WHEN C1%notfound; end loop; EXCEPTION WHEN Stoc_zero THEN DBMS_OUTPUT.put_line ('filmul: '||v_cod||' are stocul zero'); close c1; end; / -4. Creati tabela erori continand codul erorii, si un mesaj de eroare. Updatati stocul casetelor cu nr de inventar 11 la 100. Daca cu exista caseta respectiva , invocati o exceptie pentru eroare aparuta. Introduceti in tabela erori codul erorii respective si mesajul. DROP TABLE erori; CREATE TABLE erori (cod_eroare NUMBER(10), mesaj_eroare VARCHAR2(255)); DECLARE cod NUMBER; mesaj VARCHAR2(255); invalid EXCEPTION; PRAGMA EXCEPTION_INIT(invalid,-20899); BEGIN UPDATE casete

11

SET nr_copii=100 WHERE nr_inventar=11; IF sql%notfound THEN RAISE_APPLICATION_ERROR (-20899,'Nr inventar invalid!'); END IF; EXCEPTION WHEN invalid THEN DBMS_OUTPUT.PUT_LINE('Nu exista caseta cu acest cod'); cod:=SQLCODE; mesaj:=SQLERRM; INSERT INTO erori VALUES(cod, mesaj); END; / SELECT * FROM erori;

E. Gestionarea cursorilor: implicii i explicii

-- 1. Afiai toi toate casetele ,numele si genul fiecarui film.


SET SERVEROUTPUT ON DECLARE cursor c_casete is select nr_inventar,cod_film, nr_copii from casete order by nr_inventar; cursor c_filme(c_cod_film number) is select titlu, gen ,cod_fil from filme where cod_film=c_cod_film; rec_c_casete c_casete%rowtype; rec_c_filme c_filme%rowtype; begin open c_casete; loop fetch c_casete into rec_c_casete; exit when c_casete%notfound; dbms_output.put_line('caseta are '||rec_c_casete.nr_inventar|| 'si '|| rec_c_casete.nr_copii); open c_filme(rec_c_casete.cod_film); loop fetch c_filme into rec_c_filme; exit when c_filme%notfound;

12

dbms_output.put_line('filmul cu codul '||rec_c_filme.cod_film||' se chiama'|| rec_c_filme.titlu||'si e de genul'||rec_c_filme.gen); end loop; close c_filme; end loop; close c_casete; end; / -- 2. Afiai informaii despre primele 3 inchirieri dupa data la care au fost effectuate. drop table situa; CREATE TABLE situa AS SELECT c.cod_client cod ,c.nume nume, c.prenume prenume, p.data_inchirierii data_in FROM clienti c, inchirieri p WHERE c.cod_client=p.cod_client; SET SERVEROUTPUT ON DECLARE cursor c_com is select cod, nume,prenume,data_in FROM situa order by data_in desc; rec_com c_com%rowtype; begin open c_com; loop fetch c_com into rec_com; exit when c_com%notfound or c_com%rowcount>3; dbms_output.put_line('clientul cu codul '||rec_com.cod||' are numele'||rec_com.nume||''|| rec_com.prenume||'si a inchiriat pe data de '||rec_com.data_in||'.'); end loop; close c_com; end; / -- 3. Afisati codul filmelor care nu sunt inchiriate fol un cursor explicit. drop table neinchiriate; create table neinchiriate as select p.nr_inventar nr,p.cod_film cod from casete p, inchirieri c where p.nr_inventar=c.nr_inventar(+) minus select p.nr_inventar nr, p.cod_film cod from casete p, inchirieri c where p.nr_inventar(+)=c.nr_inventar; SET SERVEROUTPUT ON DECLARE v_cod neinchiriate.cod%type; v_valoare neinchiriate.nr%type; cursor c1 is select cod, nr from neinchiriate ; BEGIN open c1; loop fetch c1 into v_cod, v_valoare;

13

exit when c1%notfound; DBMS_OUTPUT.PUT_LINE('nr_inventar '||v_valoare||' cod film '||v_cod); end loop; close c1; end; / -- 5. Sa se stearga inregistrarile din tabela inchirierii care sau realizat acuma mai bine de 2 luni si sa se afiseze numarul de randuri selectate. SET SERVEROUTPUT ON BEGIN DELETE FROM inchirieri WHERE months_between(sysdate,data_inchirierii)>2; DBMS_OUTPUT.PUT_LINE (SQL%ROWCOUNT || ' randuri sterse'); COMMIT; END; / -- 6. Afisati primii 3 clienti care au facut cele mai multe inchirieri. SET SERVEROUTPUT ON DECLARE cursor c1 is select cod_client, nume, prenume from clienti ; cursor c2(c_cod_client number) is select count(cod_client) nr from inchirieri where cod_client=c_cod_client order by count(cod_client); rec_c1 c1%rowtype; rec_c2 c2%rowtype; BEGIN dbms_output.put_line('Numarul de inchirieri pentru fiecare client:'); if not c1%isopen then open c1; end if; loop fetch c1 into rec_c1; exit when c1%notfound or c1%rowcount>3; dbms_output.put_line('clientul '||rec_c1.nume||' '||rec_c1.prenume); open c2(rec_c1.cod_client); loop fetch c2 into rec_c2; exit when c2%notfound; dbms_output.put_line('a efectuat '||rec_c2.nr||' comenzi.'); end loop; close c2; end loop; close c1; end; /

14

-- 7. Pentru toate casetele sa se updateze scocul, marindul cu 10 procente. set serveroutput on DECLARE nr casete.nr_inventar%type; nr_i casete.nr_copii%type; cod casete.cod_film%type; cursor c1 is select nr_inventar, cod_film, nr_copii*1.1 from casete for update of nr_copii nowait; i number(2); BEGIN select count(nr_inventar) into nr from casete; open c1; for i in 1..nr loop fetch c1 into nr,nr_i,cod; exit when nr<0 or c1%notfound; dbms_output.put_line('Pt filmul cu codul '||nr||' i sa marit stocul la '||nr_i); end loop; END; /

F. Funcii, proceduri, includerea acestora n pachete.


-1. Sa se modifice data intrarii in evidenta la o data primita ca parametru de intrare pentru o anumita comanda. CREATE or REPLACE PROCEDURE modif_data (datin IN casete.data_intrarii%type, nrinv in casete.nr_inventar%type) IS BEGIN update casete set data_intrarii=datin where nr_inventar=nrcom; END; / --Apelul: call modif_data(to_date('17 apr 2008','dd mon yyyy'),1); select * from casete; -2. Sa se afiseze prenumele si nr de tel al unui client cu un anumit cod. create or replace procedure informatii (nr in clienti.cod_client%type, prenume out clienti.prenume%type, telefon out clienti.nr_telefon%type) is begin select prenume,nr_telefon into prenume, telefon from clienti

15

where cod_client=nr; end informatii; / show errors; declare prenume_c clienti.prenume%type; telefon clienti.nr_telefon%type; begin informatii(11, prenume_c, telefon); dbms_output.put_line('Prenumele acestui client este: '||prenume_c||' si telefonul este: '|| telefon); end; / -3. Scrieti functia care verifica daca exista un cleint cu codul coda in tabela clienti. create or replace function verif(coda clienti.cod_client%type) return boolean is nr number; begin select count(cod_client) into nr from clienti where cod_client=coda; if nr=0 then return false; else return true; end if; end; / show errors; -4. Sa se insereze in tabela clienti un client nou, verificandu-se daca nu a fost deja introdus. Create or replace procedure inserare (nr clienti.cod_client%type, nume clienti.nume%type, prenume clienti.prenume%type, adresa clienti.adresa%type, telefon clienti.nr_telefon%type, calificativ clienti.calificativ%type) is except exception; begin if not verify(nr) then insert into clienti values(nr, nume, prenume, adresa, telefon, calificativ, ); else raise except; end if; exception when except then dbms_output.put_line('clientul cu codul '||nr||' exista deja'); end; / show errors; call inserare('12','Bratu','Iuliana','Bld. Marasti','2222222222','Satisfacator'); select * from clienti;

16

-5. Scrieti functia care verifica daca stocul pentru caseta cu codul este suficient, avand ca limita 50 unitati. create or replace function verif1(cod casete.cod_film%type) return boolean is valoare number(5):=50; copii casete.nr_copii%type; begin select nr_copii into copii from casete where cod_film=cod; if copii>valoare then return true; else return false; end if; end; / show errors; set serveroutput on begin if (verif1(22)) then dbms_output.put_line('Stoc suficient. '); else dbms_output.put_line('Stoc insuficient. '); end if; end; / -6. Scrieti functi care verifica daca a expirat termenul de returnare al unei casete. create or replace function verif2(cod inchirieri.nr_inventar%type) return boolean is data_exp date; begin select (data_returnarii) into data_exp from inchirieri where nr_inventar=cod; if data_exp<trunc(sysdate) then return true; else return false; end if; end; / show errors; set serveroutput on begin if (verif2(1)) then dbms_output.put_line('Termenul a expirat. '); else dbms_output.put_line('Termenul nu a expirat. '); end if; end; /

17

-7. Scrieti functia care verifica daca un film este de genul actiune sau sf. Daca este un film sf functia returneaza true, altfel, functia returneaza false.

create or replace function verif3(cod casete.nr_inventar%type) return boolean is gen filme.gen%type; begin select a.gen into gen from filme a, casete c where c.cod_film=a.cod_film; if upper(gen)='SF' then return true; else return false; end if; end; / show errors; set serveroutput on begin if (verif3(4)) then dbms_output.put_line('filmu este de gen sf. '); else dbms_output.put_line('filmu este de gen action. '); end if; end; / -8. Returneaza true/false daca nr de copii al casetei este mai mare/mai mic sau egal cu nr mediu si null daca caseta nu exista. select avg(copii) into avg_copii from casete; if copii>avg_copii then return true; else return false; end if; exception when no_data_found then return NULL; end; / show errors; set serveroutput on begin if (verif4 is NULL) then dbms_output.put_line('caseta cu cod invalid!'); elsif (verif4) then dbms_output.put_line('caseta are stocul mai mare decat media! '); else

18

dbms_output.put_line('caseta are stocul mai mic decat media!'); end if; end; / Pachete de subprograme: -1. Sa se construiasca un subprogram de tip pachet denumit actualizare_clienti care sa efectueze operatiile de actualizare pentru tabela clienti (inserare, modificare, stergere), precum si o functie pentru validarea accesului la tabela clienti. CREATE OR REPLACE PACKAGE actualizare_clienti IS procedure inserare (nr clienti.cod_client%type, nume clienti.nume%type, prenume clienti.prenume%type, adresa clienti.adresa%type, telefon clienti.nr_telefon%type, calificativ clienti.calificativ%type) procedure modifica_client (nr clienti.cod_client%type, nume clienti.nume%type, prenume clienti.prenume%type); procedure sterge_client (nr clienti.cod_client%type); function verif (coda clienti.cod_client%type) return boolean; exceptie exception; nr number; END; /

CREATE OR REPLACE PACKAGE BODY actualizare_clienti IS procedure inserare (nr clienti.cod_client%type, nume clienti.nume%type, prenume clienti.prenume%type, adresa clienti.adresa%type, telefon clienti.nr_telefon%type, calificativ clienti.calificativ%type) is except exception; begin if not verify(nr) then insert into clienti values(nr, nume, prenume, adresa, telefon, calificativ, ); else raise except; end if; exception when except then dbms_output.put_line('clientul cu codul '||nr||' exista deja');

19

end; procedure modifica_client (nr clienti.cod_client%type, nume clienti.nume%type, prenume clienti.prenume %type) is begin if verif(nr) then update angajati set clienti.nume=nume, clienti.prenume=prenume where clienti.cod_client=nr; else raise exceptie; end if; exception when exceptie then dbms_output.put_line('clientul cu acest cod nu exista'); end; procedure sterge_client (nr clienti.cod_client%type) is begin if verif(nr) then delete from clienti where cod_client=nr; else raise exceptie; end if; exception when exceptie then dbms_output.put_line('clientul cu aceast cod nu exista'); end; function verif(coda clienti.cod_client%type) return boolean is nr number; begin select count(cod_client) into nr from client where cod_client=coda; if nr=0 then return false; else return true; end if; end; END; / show errors;

20

-2. Sa se construiasca un subprogram de tip pachet denumit actualizare care sa efectueze operatiile de actualizare pentru tabela casete (inserare, modificare, stergere), precum si o functie pentru validarea accesului la tabela casete. CREATE OR REPLACE PACKAGE actualizare IS procedure adauga_caseta (p_codp casete.nr_inventar%type, codf casete.cod_film%type, copii casete.nr_copii%type data_i caste.data_intarii%type nr casete.nr_inchirieri%type ); procedure modifica_caseta (p_codp casete.nr_inventar%type, codf casete.cod_film%type, nr casete.nr_inchirieri%type); procedure sterge_caseta (p_codp casete.nr_inventar%type); function verificare (p_codp casete.nr_inventar%type) return boolean; exceptie exception; END; /

CREATE OR REPLACE PACKAGE actualizare IS procedure adauga_caseta (p_codp casete.nr_inventar%type, codf casete.cod_film%type, copii casete.nr_copii%type, data_i caste.data_intarii%type, nr casete.nr_inchirieri%type) is begin if verificare(p_codp) then raise exceptie; else insert into casete(nr_inventar,cod_film, nr_copii,data_inchirierii) values (p_codp, codf, nr,data_i); end if; exception when exceptie then dbms_output.put_line('caseta existenta!'); end; procedure modifica_casete (p_codp casete.nr_inventar%type, codf casete.cod_film%type,

21

nr casete.nr_copii%type) is begin if verificare(p_codp) then update casete set nr_invetar=p_codp, nr_copii=copii where nr_inventar=p_codp; else raise exceptie; end if; exception when exceptie then dbms_output.put_line('caseta cu aceast cod nu exista!'); end; procedure modifica_casete (p_codp casete.nr_inventar%type, codf casete.cod_film%type) is begin if verificare(p_codp) then update casete set nr_copii=nr where nr_inventar=p_codp; else raise exceptie; end if; exception when exceptie then dbms_output.put_line('caseta cu aceast cod nu exista!'); end; procedure sterge_caseta (p_codp casete.nr_inventar%type) is begin if verificare(p_codp) then delete from produse where nr_inventar=p_codp; dbms_output.put_line('caseta cu codul '||p_codp||' a fost stearsa!'); else raise exceptie; end if; exception when exceptie then dbms_output.put_line('caseta cu aceast cod nu exista!'); end; function verificare (p_codp casete.nr_inventar%type) return boolean is v_unu number; begin select 1 into v_unu

22

from casete where nr_inventar=p_codp; return true; exception when no_data_found then return false; end; END; / show errors;

G. Declansatori
-1. Sa se creeze un trigger care se declanseaza inaintea fiecarei operatii de stergere din tabela comenzi. CREATE OR REPLACE TRIGGER trigger1 BEFORE DELETE ON casete BEGIN RAISE_APPLICATION_ERROR (-20021, 'STERGEREA NU POATE FI REALIZATA' ); END; / show errors; -2. Sa se insereze in tabela mesaje tipul operatiei executate, utilizatorul si data curenta, folosind un trigger pentru operatiile de inserare, actualizare si stergere din tabela comenzi drop table mesaje; create table mesaje( tipul varchar2(1), utilizator varchar2(100), datac date default sysdate); create or replace trigger trigger2 before insert or update or delete on inchirieri declare v_tipul mesaje.tipul%type; begin case when inserting then v_tipul:='I'; when updating then v_tipul:='U'; else v_tipul:='D'; end case; insert into mesaje values (v_tip, user, sysdate); end; / show errors; -3. Sa se actualizeze codul clientui in inchirieri cand el este modificat in clienti; CREATE OR REPLACE TRIGGER trigger3 BEFORE UPDATE OF cod_client ON clienti FOR EACH ROW BEGIN

23

update inchirieri set cod_client = :new.cod_client where cod_client = :old.cod_client; END; /

24