pasiinviata · web viewbaza de date contine urmatoarele tabele : angajati ( coda number(3) primary...

29
ACADEMIA DE STUDII ECONOMICE BUCURESTI FACULTATEA DE CIBERNETICA,STATISTICA SI INFORMATICA ECONOMICA PROIECT - SGBD - Student: Ivascu Claudia-Anitta An.II Seria.B Grupa : 1034

Upload: others

Post on 20-Oct-2020

4 views

Category:

Documents


0 download

TRANSCRIPT

ACADEMIA DE STUDII ECONOMICE BUCURESTI

FACULTATEA DE CIBERNETICA,STATISTICA SI INFORMATICA ECONOMICA

PROIECT - SGBD -

Student: Ivascu Claudia-Anitta

An.II Seria.B Grupa : 1034

BUCURESTI,2010

Initial baza de date avea urmatoarele caracteristici:

ANGAJATI:

CODA

NUME

ADRESA : LOC

STR structura de grup

DATA_ANG

CODS

FUNCTIE

SAL

CODDEP

DEPARTAMENTE :

CODDEP

DEN_DEP

PRODUSE:

CODP

DENP

PRET

STOC

CLIENTI:

CODC

DENC

LOC

COMENZI:

NRCOM

CODC

DATA_I

DATA_L

VAL

RAND_COM

NRCOM

CODP

CANT

Se elimina structurile de grup din tabela ANGAJAT.

ANGAJATI:

CODA

NUME

LOC

STR

DATA_ANG

CODS

FUNCTIE

SAL

CODDEP

Datorita faptului ca intre campurile tabelelor nu mai exista dependente de nici un alt fel (functionale, incomplete sau tranzitive) putem considera tabelele ca fiind in FN3.

Baza de date contine urmatoarele tabele :

ANGAJATI ( coda number(3) primary key, nume varchar2(30) , loc varchar2(20), str varchar2(10), data_ang date, cods number(3): Angajati , functie varchar2(30), sal number(5),

coddep number(3) : Departamente)

DEPARTAMENTE (coddep numbe(3) primary key, den_dep varchar2(30))

PRODUSE (codp varchar2(3) primary key, denp varchar2(30), pret number(5), stoc number(5), coddep numbe(3):Departamente)

CLIENTI (codc number(3) primary key, denc varchar2(50), loc varchar2(20))

COMENZI(nrcom number(5) primary key, data_i date, data_l date, val number (10), codc number(3):Clienti)

RAND_COM (nrcom number(5):Comenzi, codp varchar2(3): Produse, cant number(5))

Definirea legaturilor :

Legatura dintre Departamente si Angajati este de tipul 1: m (un angajat apartine unui singur department, un departament are mai multi angajati)

Legatura dintre Departamente si Produse este de tipul 1:m ( un produs este oferit de un singur department , un department contine mai multe produse)

Legatura dintre Produse si Comenzi este de tipul m:m , relatie despartita in relatie 1:1( intre Produse si Rand_com) si 1:m (intre Rand_com si Comenzi)

Legatura dintre Clienti si Comenzi este de tipul 1:m ( un client poate face mai multe comenzi insa o comanda este data de un singur client)

*Alte rectrictii le vom defini ulterior in cerinte.

SCHEMA CONCEPTUALA

ANGAJATI

CODA

NUME

LOC

STR

DATA_ANG

CODS

FUNCTIE

SAL

CODDEP

PRODUSE

CODP

DENP

PRET

STOC

CODDEP

DEPARTAMENT

CODDEP

DEN_DEP

RAND_COM

NRCOM

CODP

CANT

COMENZI

NRCOM

CODC

DATA_I

DATA_L

VAL

CLIENTI

CODC

DENC

LOC

CREAREA SI GESTIUNEA TABELELOR

Sa se creeze tabelele cu structurile de mai sus.

create table angajati (coda number(3) constraint PK_ang primary key,

nume varchar2(30),

loc varchar2(20),

str varchar2(10),

data_ang date,

cods number(3) references angajati(coda) ,

functie varchar2(30),

sal number(5),

coddep number(3) references departamente(coddep));

create table departamente (coddep number(3) constraint PK_dep primary key,

den_dep varchar2(30))

create table produse(codp varchar2(3) constraint PK_prod primary key,

denp varchar2(30),

pret number(5),

stoc number(5),

coddep number(3) references departamente(coddep));

create table clienti(codc number(3) constraint PK_cl primary key,

denc varchar2(50),

loc varchar2(20));

create table comenzi(nrcom number(5) constraint PK_com primary key,

data_i date,

data_l date,

val number (10),

codc number(3) references clienti(codc));

create table rand_com(nrcom number(5) references comenzi(nrcom),

codp varchar2(3) references produse(codp),

cant number(5));

Sa se defineasca restrictiile de cheie primara pentru tabela Rand_com (codp si nrcom)

alter table Rand_com

add constraint PK_pc primary key (nrcom,codp);

alter table Rand_com

add constraint FK_pc_prod foreign key (codp) references Produse(codp);

alter table Rand_com on delete set null

add constraint FK_pc_com foreign key (nrcom)

references Comenzi (nrcom) on delete cascade;

Sa se adauge restrictia entitatii (NOT NULL) pentru tabela Produse , atributul denp.

alter table Produseadd constraint NN_codpcheck (‘codp’ IS NOT NULL);

Sa se adauge restrictia de unicitate pentru atributele codc si coda din tabelele Clienti, respective Angajati.

alter table Clienti

add constraint Un_cc unique(codc);

alter table Angajati

add constraint Un_ang unique(coda);

Sa se marcheze atributul str din tabela Angajati ca atribut neutilizat.

alter table Angajati set unused(str);

Sa se stearga atributul marcat ca neutilizat.

alter table Angajati drop unused columns;

ACTUALIZAREA DATELOR

Scriptul de adaugare de inregistrari :

Delete from Angajati;

Insert into Angajati values ( ‘1’, ‘Negrea Dorin’, ‘Hunedoara’, to_date (‘01-03-2000’, ‘dd-mm-yyyy’), null , ‘Sef Depozit’, ‘1000’,’009’);

Insert into Angajati values ( ‘2’, ‘Barbu Mihai’, ‘Cluj’, to_date (‘17-06-2008’, ‘dd-mm-yyyy’), ‘1’, ‘Functionar Depozit’, ‘800’,’009’);

Insert into Angajati values ( ‘3’, ‘Demea Monica’, ‘Iasi’, to_date (‘21-07-2006’, ‘dd-mm-yyyy’), null , ‘Sef Vanzari’, ‘1000’,’006’);

Insert into Angajati values ( ‘4’, ‘Vantu Catalin’, ‘Deva’, to_date (‘14-01-2001’, ‘dd-mm-yyyy’), ‘3’, ‘Functionar Vanzari’, ‘800’,’006’);

Insert into Angajati values ( ‘5’, ‘Marin Ion’, ‘Galati’, to_date (‘02-11-2000’, ‘dd-mm-yyyy’), ‘1’ , ‘Functionar Depozit’, ‘800’,’009’);

Insert into Angajati values ( ‘6’, ‘Perijoc Daniel’, ‘Hunedoara’, to_date (‘13-09-2009’, ‘dd-mm-yyyy’), null , ‘Sef Contabilitate’, ‘1000’,’003’);

Insert into Angajati values ( ‘7’, ‘Flore Andreea’, ‘Bucuresti’, to_date (‘17-11-2001’, ‘dd-mm-yyyy’), ‘6’ , ‘Economist’, ‘900’,’003’);

Insert into Angajati values ( ‘8’, ‘Popescu Ion’, ‘Arad’, to_date (‘01-09-2002’, ‘dd-mm-yyyy’), ‘1’ , ‘Functionar Depozit’, ‘800’,’009’);

Insert into Angajati values ( ‘9’, ‘Lungu Lucian’, ‘Alexandria’, to_date (‘03-12-2004’, ‘dd-mm-yyyy’), ‘3’ , ‘Functionar Depozit’, ‘800’,’009’);

Insert into Angajati values ( ‘10’, ‘Munteanu Irina’, ‘Bucuresti’, to_date (‘09-04-2006’, ‘dd-mm-yyyy’), ‘1’, ‘Functionar Vanzari’, ‘800’,’006’);

Delete from Departamente;

Insert into Departamente values (‘003’, ‘Contabilitate’);

Insert into Departamente values (‘006’, ‘Vanzari’);

Insert into Departamente values (‘009’, ‘Depozit’);

Delete from Produse ;

Insert into Produse values (‘V44’, ‘Vobler’, ‘25’ , ‘300’ , ‘009’);

Insert into Produse values (‘L45’, ‘Lansete’, ‘400’ , ‘100’ , ‘009’);

Insert into Produse values (‘M46’, ‘Mulinete’, ‘150’ , ‘233’ , ‘009’);

Insert into Produse values (‘H47’, ‘Huse’, ‘175’ , ‘200’ , ‘009’);

Insert into Produse values (‘CT48’, ‘Cort’, ‘1000’ , ‘44’ , ‘006’);

Insert into Produse values (‘B49’, ‘Barca’, ‘850’ , ‘15’ , '006');

Insert into Produse values (‘MG50’, ‘Minciog’, ‘30’ , ‘400’ , ‘009’);

Insert into Produse values (‘JV51’, ‘Juvelnic’, ‘17’ , ‘300’ , ‘009’);

Delete from Clienti;

Insert into Clienti values ( 011, ‘Gipo’ , ‘Bucuresti’);

Insert into Clienti values ( 012, ‘Rapala’ , ‘Arad’);

Insert into Clienti values ( 013, ‘BibanFish’ , ‘Cluj’);

Insert into Clienti values ( 014, ‘TotalFishing’ , ‘Bucuresti’);

Insert into Clienti values ( 015, ‘CrazyFish’ , ‘Timisoara’);

Insert into Clienti values ( 016, ‘Pescarul’ , ‘Craiova’);

Insert into Clienti values ( 017, ‘Pescarusi’ , ‘Iasi’);

Insert into Clienti values ( 018, ‘Campionii’ , ‘Tulcea’);

Insert into Clienti values ( 019, ‘Schimano’ , ‘Braila’);

Delete from Comenzi;

Insert into Comenzi (nrcom, data_i , data_l, val , codc ) values (1000, to_date (‘18-05-2000’, ‘dd-mm-yyyy’) , to_date (‘20-05-2000’, ‘dd-mm-yyyy’) ‘450000’, ‘015’);

Insert into Comenzi (nrcom, data_i , data_l, val , codc ) values (1444, to_date (‘23-05-2001’, ‘dd-mm-yyyy’) , to_date (‘20-06-2001’, ‘dd-mm-yyyy’) , ‘670000’, ‘011’);

Insert into Comenzi (nrcom, data_i , data_l, val , codc )values (1892, to_date (‘12-09-2001’, ‘dd-mm-yyyy’) , to_date (‘14-09-2001’, ‘dd-mm-yyyy’), ‘20000’, ‘014’);

Insert into Comenzi (nrcom, data_i , data_l, val , codc ) values (1920, to_date (‘03-11-2001’, ‘dd-mm-yyyy’) , to_date (‘16-11-2001’, ‘dd-mm-yyyy’) , ‘50000’, ‘017’);

Insert into Comenzi (nrcom, data_i , data_l, val , codc ) values (1988, to_date (‘11-01-2002’, ‘dd-mm-yyyy’) , to_date (‘24-01-2001’, ‘dd-mm-yyyy’) , ‘234900’, ‘019’);

Insert into Comenzi (nrcom, data_i , data_l, val , codc ) values (2000, to_date (‘03-03-2002’, ‘dd-mm-yyyy’) , to_date (‘09-03-2002’, ‘dd-mm-yyyy’), ‘640000’, ‘018’);

Insert into Comenzi (nrcom, data_i , data_l, val , codc ) values (2014, to_date (‘15-05-2002’, ‘dd-mm-yyyy’) , to_date (‘22-05-2002’, ‘dd-mm-yyyy’), ‘540000’, ‘014’);

Insert into Comenzi (nrcom, data_i , data_l, val , codc ) values (2231, to_date (‘01-09-2002’, ‘dd-mm-yyyy’) , to_date (‘10-09-2002’, ‘dd-mm-yyyy’) , ‘760000’, ‘012’);

Insert into Comenzi (nrcom, data_i , data_l, val , codc ) values (2280, to_date (‘18-10-2002’, ‘dd-mm-yyyy’) , to_date (‘27-10-2001’, ‘dd-mm-yyyy’) , ‘870000’, ‘017’);

Insert into Comenzi (nrcom, data_i , data_l, val , codc ) values (2300, to_date (‘07-01-2003’, ‘dd-mm-yyyy’) , to_date (‘17-01-2003’, ‘dd-mm-yyyy’), ‘900000’, ‘019’);

Insert into Comenzi (nrcom, data_i , data_l, val , codc ) values (2314, to_date (‘14-07-2003’, ‘dd-mm-yyyy’) , to_date (‘26-07-2003’, ‘dd-mm-yyyy’) , ‘470000’, ‘015’);

Insert into Comenzi (nrcom, data_i , data_l, val , codc ) values (2443, to_date (‘09-12-2003’, ‘dd-mm-yyyy’) , to_date (‘20-01-2004’, ‘dd-mm-yyyy’) ‘180000’, ‘014’);

Insert into Comenzi (nrcom, data_i , data_l, val , codc ) values (2458, to_date (‘19-04-2004’, ‘dd-mm-yyyy’) , to_date (‘30-04-2004’, ‘dd-mm-yyyy’) , ‘340000’, ‘012’);

Insert into Comenzi (nrcom, data_i , data_l, val , codc ) values (2517, to_date (‘15-10-2004’, ‘dd-mm-yyyy’) , to_date (‘18-10-2004’, ‘dd-mm-yyyy’) ,‘280000’, ‘013’);

Insert into Comenzi (nrcom, data_i , data_l, val , codc ) values (2561, to_date (‘18-09-2005’, ‘dd-mm-yyyy’) , to_date (‘20-09-2005’, ‘dd-mm-yyyy’) ,‘150000’, ‘011’);

Insert into Comenzi (nrcom, data_i , data_l, val , codc ) values (2584, to_date (‘14-03-2006’, ‘dd-mm-yyyy’) , to_date (‘23-03-2006’, ‘dd-mm-yyyy’) ,‘270000’, ‘017’);

Insert into Comenzi (nrcom, data_i , data_l, val , codc ) values (2617, to_date (‘07-07-2006’, ‘dd-mm-yyyy’) , to_date (‘02-08-2006’, ‘dd-mm-yyyy’) ‘310000’, ‘018’);

Insert into Comenzi (nrcom, data_i , data_l, val , codc ) values (2648, to_date (‘24-02-2007’, ‘dd-mm-yyyy’) , to_date (‘06-03-2007’, ‘dd-mm-yyyy’) , ‘180000’, ‘016’);

Insert into Comenzi (nrcom, data_i , data_l, val , codc ) values (2741, to_date (‘11-08-2007’, ‘dd-mm-yyyy’) , to_date (‘04-09-2007’, ‘dd-mm-yyyy’) , ‘287500’, ‘015’);

Insert into Comenzi (nrcom, data_i , data_l, val , codc ) values (3011, to_date (‘12-01-2008’, ‘dd-mm-yyyy’) , to_date (‘13-02-2008’, ‘dd-mm-yyyy’) , ‘2125000’, ‘019’);

Insert into Comenzi (nrcom, data_i , data_l, val , codc ) values (3344, to_date (‘14-07-2008’, ‘dd-mm-yyyy’) , to_date (‘13-08-2008’, ‘dd-mm-yyyy’), ‘480000’, ‘013’);

Insert into Comenzi (nrcom, data_i , data_l, val , codc ) values (4529, to_date (‘10-05-2009’, ‘dd-mm-yyyy’) , to_date (‘15-05-2009’, ‘dd-mm-yyyy’) , ‘620000’, ‘017’);

Delete from Rand_com;

Insert into Rand_com VALUES (1444, ‘CT8’, ‘670’);

Insert into Rand_com VALUES (1920, ‘L45’, ‘125’);

Insert into Rand_com VALUES (2014, ‘M46’, ‘3600’);

Insert into Rand_com VALUES (2280, ‘CT8’, ‘497’);

Insert into Rand_com VALUES (2443,’CT8’, ‘180’);

Insert into Rand_com VALUES (2458, ‘MG5’, ‘11334’);

Insert into Rand_com VALUES (2561, ‘M46’, ‘1866’);

Insert into Rand_com VALUES (2617, ‘V44’, ‘12400’);

Insert into Rand_com VALUES (2741, ‘JV51’, ‘16910’);

Insert into Rand_com VALUES (3011, ‘B49’, ‘2500’);

Comenzile DML

Sa se adauge in tabela Clienti_buc informatii despre clientii din Bucuresti. Tabela Clienti_buc are aceeiasi structura ca tabela Clienti.

create table clienti_buc(codc number(3) constraint PK_cl primary key,

denc varchar2(50),

loc varchar2(20));

insert into client_buc select * from Clienti

where unitcap(loc)= ‘Bucuresti’;

Sa se utilizeze o singura comanda INSERT pentru a incarca in tabela Istorie_sal codul numele si salariul angajatiilor care au un salariu > 900 , iar in tabela Istorie_functie codul numele si functia angajatiilor care au functia Functionar Depozit, folosind un cursor sa se afiseze continutul tabelei istorie_sal.

Dialog

create table istorie_sal(coda number(3) constraint PK_ang1 primary key , nume varchar2(30), sal number(5));

create table istorie_functie(coda number(3) constraint PK_ang2 primary key , nume varchar2(30), functie varchar2(30)) ;

Command line

Set serveroutput on

Declare

Cursor x is select * from istorie_sal;

begin

insert all

when sal>900 then

into istorie_sal values (coda , nume , sal)

when functie= 'Functionar Depozit' then

into istorie_functie values(coda, nume, functie)

select coda , nume, sal, functie from Angajati;

dbms_output.put_line('Nume || Salariu || Cod Angajat ');

for v in x loop

dbms_output.put_line(v.nume||' '||v.sal||' '||v.coda);

end loop;

end;

/

Comanda Update :

Sa se diminueze stocul cu x buc pentru un produs introdus de la tastatura. Unde x este o valoare introdusa de utilizator. In cazul in care stocul ajunge pe minus se va anula tranzactia. In cazul in care nu exista produsul se va invoca o exceptie.

Set serveroutput on

Accept y prompt 'Introduceti denumirea produsului';

Accept x prompt 'Introduceti nr de bucati cu care sa se diminueze stocul';

Declare

a produse.stoc%type:=&x;

b produse.denp%type:='&y';

x1 exception;

x2 exception;

c produse.denp%type;

begin

select stoc into c from produse where denp=initcap(b);

dbms_output.put_line('Stocul produsului '||b||' este: '||c);

Update Produse

Set stoc=stoc-a

Where denp=initcap(b);

If SQL%NOTFOUND then RAISE x1;

End if;

Select stoc into a from produse where denp=initcap(b);

If a<0 then RAISE x2;

End if;

select stoc into c from produse where denp=initcap(b);

dbms_output.put_line('Noul stoc al produsului '||b|| ' este de: '||c);

Exception

When x1 then dbms_output.put_line('Nu s-a gasit produsul dorit!');

When x2 then dbms_output.put_line('Stoc negativ!?') ; ROLLBACK;

when NO_DATA_FOUND then dbms_output.put_line('Nu s-a gasit produsul: '||b||'!');

End;

/

Sa se modifice data de livrare si valoarea comenzii x – comanda x sa aiba acelasi termen de livrare si valoare cu comanda 1444). X introdus de la tastatura. Tratati exceptiile.

Set serveroutput on

Accept x prompt 'Introduceti Codul Comenzii: ';

Declare

x comenzi.nrcom%type:=&x;

v_data comenzi.data_l%type;

v_val comenzi.val%type;

begin

select data_l, val into v_data, v_val from comenzi where nrcom=x;

dbms_output.put_line('Data initiala: '||v_data);

dbms_output.put_line('Valoare initiala: '||v_val);

Update Comenzi

Set data_l=(select data_l from comenzi

Where nrcom=1444),

Val=(select val from comenzi

Where nrcom=1444)

Where nrcom=x;

select data_l, val into v_data, v_val from comenzi where nrcom=x;

dbms_output.put_line('Data actualizata: '||v_data);

dbms_output.put_line('Valoare actualizata: '||v_val);

Exception

when NO_DATA_FOUND then dbms_output.put_line('Nu exista comanda cu acel numar!');

End;

/

Creati o procedura care sa modifice salariul pe tabela angajati. Procentul de modificare este in functie de vechimea angajatilor dupa cum urmeaza:

10 ani vechime – 7%

5-10 ani vechime – 4%

1-5 ani vechime – 2%

Sub 1 an vechime – nu se modifica

set serveroutput on

Create or replace procedure modif_sal

Is

Cursor k is select round((sysdate-data_ang)/365) vech, coda, nume

from angajati

order by vech desc;

v_sal angajati.sal%type;

BEGIN

For v in k

loop

If v.vech>=10 then

select sal into v_sal from angajati where coda=v.coda;

dbms_output.put_line('Salariul Initial al angajatului '||v.nume||' este: '||v_sal);

Update angajati

Set sal=sal+sal*0.07

Where coda=v.coda;

select sal into v_sal from angajati where coda=v.coda;

dbms_output.put_line('Salariul Modificat al angajatului '||v.nume||' este: '||v_sal);

dbms_output.put_line('--------------------------------------');

End if;

If v.vech between 5 and 9 then

select sal into v_sal from angajati where coda=v.coda;

dbms_output.put_line('Salariul Initial al angajatului '||v.nume||' este: '||v_sal);

Update angajati

Set sal=sal+sal*0.04

Where coda=v.coda;

select sal into v_sal from angajati where coda=v.coda;

dbms_output.put_line('Salariul Modificat al angajatului '||v.nume||' este: '||v_sal);

dbms_output.put_line('--------------------------------------');

End if;

If v.vech between 1 and 4 then

select sal into v_sal from angajati where coda=v.coda;

dbms_output.put_line('Salariul Initial al angajatului '||v.nume||' este: '||v_sal);

Update angajati

Set sal=sal+sal*0.02

Where coda=v.coda;

select sal into v_sal from angajati where coda=v.coda;

dbms_output.put_line('Salariul Modificat al angajatului '||v.nume||' este: '||v_sal);

dbms_output.put_line('--------------------------------------');

End if;

end loop;

end;

/

show errors;

begin

modif_sal();

end;

/

Comanda Delete :

Sa se stearga toti clientii dintr-o localitate introdusa de la tastatura.Tratati exceptiile.

set serveroutput on

accept x prompt 'Introduceti localitatea: ';

declare

x clienti.loc%type:='&x';

x1 exception;

begin

delete denc

from clienti

where loc=initcap(x);

IF SQL%FOUND THEN

dbms_output.put_line('S-au sters '|| SQL%ROWCOUNT||' clienti!');

rollback;

dbms_output.put_line('S-au anulat stergerile');

ELSE RAISE x1;

END IF;

exception

when x1 then dbms_output.put_line('Nu exista clienti din localitatea: '||x);

end;

/

Sa se creeze o procedura afis_prod care afiseza informatii despre produse , ordonate crescator pe departamente si dupa denumire.

set serveroutput on

create or replace procedure afis_prod

is

cursor c is select den_dep, coddep from departamente ;

cursor k(v_coddep departamente.coddep%type) is select * from produse

where coddep=v_coddep

order by denp;

v_coddep departamente.coddep%type;

begin

for v in c

loop

dbms_output.put_line('----'||v.den_dep);

v_coddep:=v.coddep;

for v1 in k(v_coddep)

loop

dbms_output.put_line(v1.denp||' cu pretul de '||v1.pret||' ');

end loop;

end loop;

end;

/

show errors;

begin

afis_prod();

end;

/

Creati un pachet de subprograme care sa contina urmatoarele:

-o procedura pentru afisarea sefilor si subalternilor corespunzatori acestora

-o functie pentru calcularea salariului mediu pe un departament introdus de la tastatura

-o procedura pentru marirea salariului cu 15% pentru angajatii care au un salariu mai mic decat o valoarea introdusa de la tastatura cu afisarea numarului de inregistrari modificate

-o procedura care afiseaza angajatul dintr-un an introdus de la tastatura, se vor trata exceptiile predefinite.

set serveroutput on

create or replace package pachet_angajati

is

procedure big_boss ;

function medie_sal (v_dep angajati.coddep%type)

return number;

procedure update_sal (v_sal angajati.sal%type);

procedure list_ang (v_data number);

end pachet_angajati;

/

create or replace package body pachet_angajati

is

procedure big_boss is

cursor c is select coda,nume from angajati

where cods IS NULL;

cursor k(v_cods angajati.cods%type) is select nume from angajati

where cods=v_cods;

v_cods angajati.cods%type;

begin

for v in c loop

dbms_output.put_line('---'||v.nume||' are subalternii');

v_cods:=v.coda;

for x in k(v_cods) loop

dbms_output.put_line (x.nume);

end loop;

end loop;

end;

function medie_sal(v_dep angajati.coddep%type)

return number

is

v_avg number;

x number:=0;

suma number:=0;

cursor c is select sal from angajati where coddep=v_dep;

begin

for v in c loop

x:=x+1;

suma:=suma+v.sal;

end loop;

v_avg:=round(suma/x,2);

return v_avg;

end;

procedure update_sal (v_sal angajati.sal%type)

is

x exception;

begin

update angajati

set sal=sal*1.5

where sal

if SQL%NOTFOUND then raise x;

else dbms_output.put_line('S-a efectuat marirea de salariu.'); dbms_output.put_line('S-au marit '||SQL%ROWCOUNT||' salarii');

end if;

exception

when x then dbms_output.put_line('Nu s-a gasit niciun angajat cu salariul sub '||v_sal);

end;

procedure list_ang (v_data number)

is

v_nume angajati.nume%type;

begin

select nume into v_nume from angajati

where extract(year from data_ang)=v_data;

dbms_output.put_line('In anul '||v_data||' a fost angajat '||v_nume);

Exception

when NO_DATA_FOUND then dbms_output.put_line('Nu exista angajat!');

when TOO_MANY_ROWS then dbms_output.put_line('Prea multi angajati!');

end;

END;

/

show errors

--Apelurile subprogramelor incluse in pachet!!!--

accept x prompt 'Introduceti Departamentul: ';

accept x1 prompt 'Introduceti Salariul: ';

accept x2 prompt 'Introduceti Anul Angajarii: ';

declare

x angajati.coddep%type:=&x;

x1 angajati.sal%type:=&x1;

x2 number:=&x2;

begin

pachet_angajati.big_boss();

dbms_output.put_line('-----------------------------------------------');

dbms_output.put_line('Media pe departamentul '||x||' este: '||pachet_angajati.medie_sal(x));

dbms_output.put_line('-----------------------------------------------');

pachet_angajati.update_sal(x1);

dbms_output.put_line('-----------------------------------------------');

pachet_angajati.list_ang(x2);

end;

/

Sa se creeze o procedura care calculeaza si afiseaza comenzile cu cel mai mare termen de livrare respective cel mai mic si valoarile acestora in RON si USD unde cursul de schimb RON/USD este preluat de la tastatura.

set serveroutput on

create or replace procedure money (cs number)

is

x number:=0;

x1 number:=999999;

y number;

y1 number;

cursor c is select round(data_l-data_i) termen, val from comenzi;

begin

for v in c

loop

if x

end if;

if x1>v.termen then x1:=v.termen; y1:=v.val;

end if;

end loop;

dbms_output.put_line('Comanda cu termenul de livrare '||x||' are valoarea: '||y||' RON');

dbms_output.put_line('Comanda cu termenul de livrare '||x1||' are valoarea: '||y1||' RON');

y:=round(y/cs,2);

y1:=round(y1/cs,2);

dbms_output.put_line('Comanda cu termenul de livrare '||x||' are valoarea: '||y||' $');

dbms_output.put_line('Comanda cu termenul de livrare '||x1||' are valoarea: '||y1||' $');

end;

/

show errors;

accept cs prompt 'Introduceti cursul de schimb RON/USD: ';

declare

cs number:=&cs;

begin

money(cs);

end;

/

Creati un trigger care sa nu permita diminuarea stocului sub 10 unitati. In cazul in care se incearca se va apela o procedura care va mari automay stocul cu 100.

set serveroutput on

create or replace procedure marire_stoc(v_codp produse.codp%type)

is

begin

update produse

set stoc=stoc+100

where codp=v_codp;

end;

/

create or replace trigger zanu_stoc

after update on produse

for each row

declare

v_stoc_min number;

begin

if :new.stoc<10 then raise_application_error(-20202, 'Nu se poate diminua stocul sub 10 unitati!!! LICHIDARE DE STOC?!?! SOS');

marire_stoc(:new.codp);

end if;

end;

/

show errors

begin

update produse

set stoc=5

where codp='L45';

end;

/

CREATE OR REPLACE TRIGGER produse_trig

BEFORE INSERT ON produse

BEGIN

dbms_output.put_line('triggerul s-a executat');

END;

/

insert into produse (codp , denp) values ('SC7', 'Scaun');