+ All Categories
Home > Documents > proiect sgbd

proiect sgbd

Date post: 10-Aug-2015
Category:
Upload: avram-lucia-alexandra
View: 323 times
Download: 17 times
Share this document with a friend
Description:
proiect sgbd
29
ACADEMIA DE STUDII ECONOMICE, BUCURESTI FACULTATEA DE CIBERNETICA, STATISTICA SI INFORMATICA ECONOMICA PROIECT SGBD Bratosin Alexandru GRUPA 1033 SERIA C 1
Transcript
Page 1: proiect sgbd

ACADEMIA DE STUDII ECONOMICE, BUCURESTIFACULTATEA DE CIBERNETICA, STATISTICA SI INFORMATICA

ECONOMICA

PROIECT SGBD

Bratosin AlexandruGRUPA 1033

SERIA C

1

Page 2: proiect sgbd

CUPRINS

CUPRINS...............................................................................................................2

A. Descrierea problemei, crearea tabelelor, prezentarea schemei conceptuale a

tabelelor si inserarea in tabele................................................................................3

B. Interacţiunea cu serverul Oracle prin intermediul comenzilor SQL (LDD şi LMD)

..................................................................................................................................

…………………………………………………………………………………....6C. Structuri alternative şi repetitive.......................................................................7

D. Tratarea excepţiilor...........................................................................................9

E. Gestionarea cursorilor: impliciţi şi expliciţi....................................................11

F. Funcţii, proceduri, includerea acestora în pachete..........................................14

G. Declansatori.....................................................................................................22

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

2

Page 3: proiect sgbd

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;

3

Page 4: proiect sgbd

CASETENR_INVENTAR COD_FILME DATA_INTRARII NR_INCHIRIERI

FILME

COD_CLIENT NUME PRENUME ADRESA NR_TEL CALIFICATIVCLIENTI

INCHIRIERI

COD_CLIENT NR_INVENTAR DATA_INCHIRIERII DATA_RETURNARII

COD_FILM GEN TITLU REGIZOR AN ACTOR PRINCIPAl

4

Page 5: proiect sgbd

insert into casete values('2','11',to_date('10 03 2007','dd mm yyyy'),'100');insert into casete values('1','1',to_date('31 01 2007','dd mm yyyy'),'5');insert into casete values('3','21',to_date('25 05 2007','dd mm yyyy'),'50');insert into casete values('4','50',to_date('30 12 2007','dd mm yyyy'),'50');insert into casete 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'));

5

Page 6: proiect sgbd

B. Interacţiunea 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 ONbegin execute immediate 'alter table casete add(nr_copii varchar2(30))';end;/select * from casete;

-2. Sa se stearga filmul cu codul 2.

DECLAREv_nrcod filme.cod_film%TYPE := 2;BEGINDELETE FROM filme WHERE cod_film = v_nrcod;END;/select * from filme;

-3. Sa se modifice tabela Casete astfel: nr_copii number(2).

SET SERVEROUTPUT ONdeclare sir varchar2(200);beginsir:='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;

6

Page 7: proiect sgbd

BEGINupdate caseteset 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 ONdeclare v_nr casete.nr_inchirieri%type;beginselect max(nr_inchirieri) into v_cantitate from comenziDBMS_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 ONDECLAREv_nr_copii casete.nr_copii%type;BEGINSELECT 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 ONDECLAREv_nr casete.nr_inchirieri%type;v_nr_copii casete.nr_copii%type;v_necesar number(15);BEGINselect 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:=

7

Page 8: proiect sgbd

case when v_nr between 0 and 50 then 5when v_nr between 50 and 100 then 7when v_nr>100 then 10 else 0end;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 ONDECLAREv_nr casete.nr_inchirieri%type;v_nrmediu v_nr%type;i number(4):=1;BEGINselect avg(nr_inchirieri) into v_nrmediu from casete;dbms_output.put_line('Nr mediu de inchirieri este: '||v_nrmediu);loopselect 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 onDECLAREnr casete.nr_inventar%type;copii casete.nr_copii%type;cursor c1 is select nr_copii from casete;i number(2);

BEGINselect count(nr_inventar) into nr from casete;open c1;for i in 1..nrloopfetch 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;

8

Page 9: proiect sgbd

-5. Sa se afiseze codul clientilor adresa si calificativul.

set serveroutput onDECLAREnr 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;BEGINselect count(cod_client) into nr from clienti;open c1;while nr>0loopi:=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 excepţiilor

-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 ONDECLAREv_nume filme.titlu%type;BEGINSELECT titlu INTO v_nume FROM filmeWHERE reg='Zack Snyder';dbms_output.put_line('Titlul flimului cu regizorul Zack Snyder este '||v_nume);EXCEPTIONWHEN no_data_found THENdbms_output.put_line('Nu exista nici un regizor cu numele Zack Snyder ');WHEN too_many_rows THENdbms_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.

9

Page 10: proiect sgbd

DECLAREe_except EXCEPTION;PRAGMA EXCEPTION_INIT(e_except, -2292);BEGINDELETE FROM clienti;EXCEPTIONWHEN e_except THENdbms_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 ONDECLAREstoc_zero EXCEPTION;cursor c1 is select cod_film,nr_copii from casete;v_stoc casete.nr_copii%type;v_cod casete.cod_film%type;BEGINopen c1;loopfetch c1 into v_cod, v_stoc;IF v_stoc=0 THENRAISE Stoc_zero;ELSE dbms_output.put_line('filmul:' || v_cod||' are stocul '||v_stoc);END IF;EXIT WHEN C1%notfound;end loop;EXCEPTIONWHEN Stoc_zero THENDBMS_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));

DECLAREcod NUMBER;mesaj VARCHAR2(255);invalid EXCEPTION;PRAGMA EXCEPTION_INIT(invalid,-20899);BEGINUPDATE casete

10

Page 11: proiect sgbd

SET nr_copii=100WHERE nr_inventar=11;IF sql%notfound THENRAISE_APPLICATION_ERROR (-20899,'Nr inventar invalid!');END IF;EXCEPTIONWHEN invalid THENDBMS_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: impliciţi şi expliciţi

-- 1. Afişaţi toţi toate casetele ,numele si genul fiecarui film.

SET SERVEROUTPUT ONDECLAREcursor 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_filfrom filmewhere cod_film=c_cod_film;

rec_c_casete c_casete%rowtype;rec_c_filme c_filme%rowtype;

beginopen c_casete;loopfetch 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);loopfetch c_filme into rec_c_filme;exit when c_filme%notfound;

11

Page 12: proiect sgbd

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. Afişaţi informaţii despre primele 3 inchirieri dupa data la care au fost effectuate.drop table situa;CREATE TABLE situa ASSELECT c.cod_client cod ,c.nume nume, c.prenume prenume, p.data_inchirierii data_inFROM clienti c, inchirieri pWHERE c.cod_client=p.cod_client;SET SERVEROUTPUT ONDECLAREcursor c_com is select cod, nume,prenume,data_inFROM situaorder by data_in desc;rec_com c_com%rowtype;beginopen c_com;loopfetch 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 asselect p.nr_inventar nr,p.cod_film cod

from casete p, inchirieri c where p.nr_inventar=c.nr_inventar(+)minusselect p.nr_inventar nr, p.cod_film cod from casete p, inchirieri c

where p.nr_inventar(+)=c.nr_inventar;SET SERVEROUTPUT ONDECLAREv_cod neinchiriate.cod%type;v_valoare neinchiriate.nr%type;cursor c1 is select cod, nr from neinchiriate ;BEGINopen c1;loop fetch c1 into v_cod, v_valoare;

12

Page 13: proiect sgbd

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 ONBEGINDELETE FROM inchirieriWHERE 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 ONDECLAREcursor c1 is select cod_client, nume, prenume from clienti ;

cursor c2(c_cod_client number) is select count(cod_client) nrfrom inchirieriwhere cod_client=c_cod_clientorder by count(cod_client);

rec_c1 c1%rowtype;rec_c2 c2%rowtype;

BEGINdbms_output.put_line('Numarul de inchirieri pentru fiecare client:');if not c1%isopen then open c1;end if;loopfetch 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);loopfetch 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;/

13

Page 14: proiect sgbd

-- 7. Pentru toate casetele sa se updateze scocul, marindul cu 10 procente.

set serveroutput onDECLAREnr 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 casetefor update of nr_copii nowait;i number(2);BEGINselect count(nr_inventar) into nr from casete;open c1;for i in 1..nrloopfetch 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. Funcţii, 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)ISBEGINupdate caseteset data_intrarii=datinwhere 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 beginselect prenume,nr_telefon into prenume, telefon from clienti

14

Page 15: proiect sgbd

where cod_client=nr;end informatii;/show errors;

declareprenume_c clienti.prenume%type; telefon clienti.nr_telefon%type;begininformatii(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 booleanis nr number;beginselect count(cod_client) into nr from clienti where cod_client=coda;if nr=0 thenreturn false;elsereturn 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)isexcept exception;beginif not verify(nr) then insert into clienti values(nr, nume, prenume, adresa, telefon, calificativ, );else raise except;end if;exceptionwhen 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;

15

Page 16: proiect sgbd

-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 booleanisvaloare number(5):=50;copii casete.nr_copii%type;beginselect 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 onbeginif (verif1(22)) thendbms_output.put_line('Stoc suficient. ');elsedbms_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 booleanisdata_exp date;beginselect (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 onbeginif (verif2(1)) thendbms_output.put_line('Termenul a expirat. ');elsedbms_output.put_line('Termenul nu a expirat. ');end if;end;/

16

Page 17: proiect sgbd

-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 booleanisgen filme.gen%type;beginselect a.gen into gen from filme a, casete cwhere c.cod_film=a.cod_film;if upper(gen)='SF' then return true;else return false;end if;end;/show errors;

set serveroutput onbeginif (verif3(4)) thendbms_output.put_line('filmu este de gen sf. ');elsedbms_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 thenreturn true;elsereturn false;end if;exceptionwhen no_data_found thenreturn NULL;end;/show errors;

set serveroutput onbeginif (verif4 is NULL) thendbms_output.put_line('caseta cu cod invalid!');elsif (verif4) thendbms_output.put_line('caseta are stocul mai mare decat media! ');else

17

Page 18: proiect sgbd

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 ISprocedure 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 ISprocedure 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)isexcept exception;beginif not verify(nr) then insert into clienti values(nr, nume, prenume, adresa, telefon, calificativ, );else raise except;end if;exceptionwhen except then dbms_output.put_line('clientul cu codul '||nr||' exista deja');

18

Page 19: proiect sgbd

end;

procedure modifica_client(nr clienti.cod_client%type,nume clienti.nume%type,prenume clienti.prenume %type)isbeginif verif(nr) thenupdate angajatiset clienti.nume=nume, clienti.prenume=prenumewhere clienti.cod_client=nr;elseraise exceptie;end if;exceptionwhen exceptie then dbms_output.put_line('clientul cu acest cod nu exista');end;

procedure sterge_client(nr clienti.cod_client%type)isbeginif verif(nr) thendelete from clientiwhere cod_client=nr;elseraise exceptie;end if;exceptionwhen exceptie thendbms_output.put_line('clientul cu aceast cod nu exista');end;

function verif(coda clienti.cod_client%type)return booleanis nr number;beginselect count(cod_client) into nr from client where cod_client=coda;if nr=0 thenreturn false;elsereturn true;end if;end;END;/

show errors;

19

Page 20: proiect sgbd

-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 ISprocedure adauga_caseta(p_codp casete.nr_inventar%type,codf casete.cod_film%type,copii casete.nr_copii%typedata_i caste.data_intarii%typenr 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 ISprocedure 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)isbeginif verificare(p_codp) thenraise exceptie;elseinsert into casete(nr_inventar,cod_film, nr_copii,data_inchirierii) values (p_codp, codf, nr,data_i);end if;exceptionwhen exceptie then dbms_output.put_line('caseta existenta!');end;

procedure modifica_casete(p_codp casete.nr_inventar%type,codf casete.cod_film%type,

20

Page 21: proiect sgbd

nr casete.nr_copii%type)isbeginif verificare(p_codp) thenupdate caseteset nr_invetar=p_codp, nr_copii=copiiwhere nr_inventar=p_codp;elseraise exceptie;end if;exceptionwhen 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)isbeginif verificare(p_codp) thenupdate caseteset nr_copii=nrwhere nr_inventar=p_codp;elseraise exceptie;end if;exceptionwhen exceptie then dbms_output.put_line('caseta cu aceast cod nu exista!');end;

procedure sterge_caseta(p_codp casete.nr_inventar%type)isbeginif verificare(p_codp) thendelete from produsewhere nr_inventar=p_codp;dbms_output.put_line('caseta cu codul '||p_codp||' a fost stearsa!');elseraise exceptie;end if;exceptionwhen exceptie thendbms_output.put_line('caseta cu aceast cod nu exista!');end;

function verificare(p_codp casete.nr_inventar%type)return booleanisv_unu number;beginselect 1 into v_unu

21

Page 22: proiect sgbd

from casetewhere nr_inventar=p_codp;return true;exceptionwhen no_data_found thenreturn 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 trigger1BEFORE DELETE ON caseteBEGIN 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 trigger2before insert or update or delete on inchirierideclarev_tipul mesaje.tipul%type;begincase 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 trigger3BEFORE UPDATE OF cod_client ON clientiFOR EACH ROWBEGIN

22

Page 23: proiect sgbd

update inchirieriset cod_client = :new.cod_clientwhere cod_client = :old.cod_client;END;/

23


Recommended