You are on page 1of 7

create sequence Sq_Clientss start with 1

increment by 1 max 99; cycle ;


create sequence Sq_Logs start with 1 increment
by 1;
create sequence Sq_Dishes start with 1
increment by 1;
1.Se doreste sa se creeze o rocedura care sa
introduca o data cu !ecare comanda o noua
intrare intr"un alt tabel log in care sa se
consemneze !ecare chelner cati bani a adus
restaurantului#
create sequence Sq_Logs start with 1 increment
by 1; create sequence Sq_Logs start with 1
increment by 1; create sequence Sq_Dishes start
with 1 increment by 1;
create or relace rocedure log_add$_masa in
%umber&_dish_id in %umber&_nume in
'archar()
is
'_ret dishes.ret*+,-.;
begin
insert into clients 'alues
$Sq_Clientss.next'al&_masa );
insert into C/01%DS
'alues$Sq_Comands.next'al&Sq_Clients.curr'al&_
dish_id);
select ret into '_ret 2rom dishes where
id3_dish_id ;
insert into L/4_+15L.
'alues$Sq_Logs.next'al&_nume&'_ret);
begin
al.log_add$(&1&1&6'lad6);
end;
dclare
'_num number;
begin
end log_add;
(./ rocedura stocata ri'ata care sa aibe un
arametru out in care sa a7am ce 'aloare au
comenzile totale ale unui anga8at care 'a !
2olosita mai aoi intr9o 2unctie entru calcularea
salariului !ecarui chelner
create or relace rocedure salar
$'_nume in 'archar(& '_salar out %umber)
is
'_n %umber;
begin
select sum$'anzare) into '_n 2rom log_table
where nume 3 '_nume;
'_salar #3 '_n;
end salar;
declare
salaru %umber;
begin
salar$:alex:&salaru);
D50S_/;+-;+.-;+_L<%.$salaru);
end;
=.-rocedura stocata care 'a a'ea un cursor si 'a
chema o rocedura ri'ata# Si 'a rezenta
salariul !ecarui anga8at $acestia !ind latiti cu
1>* din 'anzari)
create or relace rocedure show_salaryes
is
cursor em_cursor is
select distinct nume 2rom log_table;
salaru %umber;
begin
2or '_em_rec in em_cursor
loo
salar$'_em_rec.nume&salaru);
salaru#3salaru?@.1>;
D50S_/;+-;+.-;+_L<%.$salaru);
end loo;
end show_salaryes;
A. Se doreste inregistrarea continua a roduselor
in stoc ast2el la !ecare rodu comandat automat
se 'a scadea din stocul restaurantului acel
rodus si rocedura 'a a!sa cat a mai ramas#
create or relace 2unction
taBe_2rom_StocB$'_nume 'archar(&'_cant
%umber)
return number is
'_num number;
begin
select cantitate into '_num 2rom stocBs where
nume 3'_nume;
'_num#3'_num9'_cant;
udate stocBs set cantitate3'_num where
nume3'_nume;
return $'_num);
end
declare
num %umber;
begin
num#3taBe_2rom_StocB$:aa:&();
D50S_/;+-;+.-;+_L<%.$num);
end;
Cunctie anonima # Ce trans2orma gramele in
Bilograme
create or relace 2unction g_to_Bg$'_num
number)
return number
is
begin
return $'_num?@.@@1);
end g_to_Bg;
declare
'_num %umber;
begin
'_num#3
g_to_Bg$1@@);
dbms_outut.-ut_line$'_num);
end;
>.-rocedura ce 2oloseste 2unctia anonima #
Deoarece rocedeul este di2erit in cazul in care
se realizeaza un rearat entru a9i usura munca
chelnerului 'om realiza o rocedura in care
trebuie doar sa treaca numele rearatului iar
din stoc 'or ! retrase toate ingredientele care
alcatuiesc reaaratul $.xcetie)#
create or relace rocedure dish_stoc$'_nume in
'archar()
is
'_num number;
num number;
cursor em_ingr$'_numele 'archar() is select
ingredients.nume&ingredients.grama8 2rom
ingredients&dishes where rearat_id3dishes.id
and dishes.nume3'_numele;
begin
2or '_rec in em_ingr$'_nume)
loo
'_num#3g_to_Bg$'_rec.grama8);
num#3taBe_2rom_StocB$'_rec.nume&1);
dbms_outut.ut_line$:s9a luat:DD num DD: din
stocul de : DD '_rec.nume);
end loo;
excetion
when no_data_2ound then
D50S_/;+-;+.-;+_L<%.$:<mi are rau dar in stoc
nu mai exista ingrediente necesare entru a 2ace
rearatul dorit:);
end;
$unem o excetie)
E. Festaurantul o2er osibilitatea sa maresti
ortia si retul in acelasi tim ast2el s9a creat o
rocedura care sa 2aca asta entru osatar si sa
ii suna ingredientele marite si retul marit ; nu
se aote ser'i o ortie este un Bilogram; entru
aceasta este ne'oie sa comande de doua ori
clientul;$cursor multilu cu arametru ; excetie
multili)
create or relace rocedure
mareste_ortia$'_num in number&'_dish
'archar()
is
cursor c_dish$'_dish 'archar() is select
nume&ret&grama8&id 2rom dishes where
nume3'_dish;
cursor c_ingredients$num number) is select ?
2rom ingredients where rearat_id3num;
ortie_rea_mare excetion;
begin
2or rec_dish in c_dish$'_dish)
loo
i2 rec_dish.grama8?'_numG999 then
raise ortie_rea_mare ;
end i2;
dbms_outut.ut_line$rec_dish.numeDD:-retul 'a !
#:DD rec_dish.ret?'_num DD : si grama8ul 'a ! :DD
rec_dish.grama8?'_num);
2or rec_stocB in c_ingredients $rec_dish.id)
loo
dbms_outut.ut_line$:<ngredientele 'or ! :DD
rec_stocB.%;0.DD: si grama8ul :DD
rec_stocB.4F101H ?'_num);
end loo;
end loo;
excetion
when ortie_rea_mare
then dbms_outut.ut_line$:%u se oate ser'i
ortie de un Bilogram ne are rau...:);
end;
I. 1!sarea comenzilor atat a bauturilor cat si a
mancarii in cadrul unei comenzi cerute # $ multili
cu arametri)#
create or relace rocedure
arata_comenzi$'_num number)
is
cursor c_drinBs$num %umber) is select ? 2rom
drinBs where id3num;
cursor c_dishes$num %umber)is select ? 2rom
dishes where id3num;
cursor comands $num %umber)is select ? 2rom
comands where id3num;
begin
2or r_c in comands$'_num)
loo
dbms_outut.ut_line$:Comanda numarul # :DD
r_c.id);
dbms_outut.ut_line$: -rearat:);
2or r_dis in c_dishes$r_c.D<SJ.S_<D)
loo
dbms_outut.-ut_line$: : DDr_dis.nume);
end loo;
dbms_outut.ut_line$: 5autura:);
2or r_dri in c_drinBs$r_c.DF<%KS_<D)
loo
dbms_outut.-ut_line$: : DDr_dri.nume);
end loo;
end loo;
end;
L.Cursori multili 2ara arametri M cursor imlicit
# shimbarea retului la roduse rea ie2tine.
1tunci cand se doreste marirea returilor se
stabileste o rocedura in care rodusele cu
returi rea mici sa !e marite cu >*#
create or relace rocedure adauga
is
cursor dri is select ? 2rom drinBs where retN>;
cursor dish is select ? 2rom dishes where ret
N(@;
'_num number;
begin
2or r_c in dri
loo
'_num#3r_c.ret?1.@>;
udate drinBs
set ret3'_num where id3r_c.id;
dbms_outut.ut_line$:s9au modi!cat# :DD SOL
*F/PC/;%+DD: bauturi:);
2or r_d in dish
loo
'_num#3r_d.ret?1.@>;
udate dishes
set ret3'_num where id3r_d.id;
dbms_outut.ut_line$:s9au modi!cat:DD SOL
*F/PC/;%+ DD : mancaruri:);
end loo;
end loo;
end;
+rigers#
1..ste imortant sa stim cine une la ziQstergeQ
adauga rete noi si la ce data in cazul in care 2ace
ce'a gresit.
create or relace trigger log_dish_changes
a2ter insert or udate or delete on dishes
begin
insert into whoChanges 'alues$;S.F&sysdate);
end;
(. Duminica nu se lucreaza si din aceasta cauza
nu 'om lasa e nimeni sa adauge comenzi in
aceasta zi#
create or relace trigger duminica
be2ore insert on clients
begin
i2
+/_CJ1F$S,SD1+.&:D,:) <% $:S1+:&:S;%:) +J.%
F1<S._1--L<C1+</%_.FF/F$9(@>@@&
:Duminica e inchis : );
.%D <C;
.%D;
C/D;L -.%+F; -1CK14.#
create or relace acBage al is
rocedure log_add$_masa in %umber&_dish_id
in %umber&_nume in 'archar();
rocedure show_salaryes;
2unction taBe_2rom_StocB$'_nume
'archar(&'_cant %umber) return number;
rocedure dish_stoc$'_nume in 'archar();
rocedure mareste_ortia$'_num in number);
rocedure arata_comenzi$'_num number);
rocedure adauga;
end;
si bodyul
create or relace acBage body al is
rocedure log_add$_masa in %umber&_dish_id
in %umber&_drinB_id in %umber&_nume in
'archar() is
'_ret number;
begin
insert into clients 'alues
$Sq_Clientss.next'al&_masa );
insert into C/01%DS
'alues$Sq_Comands.next'al&Sq_Clients.curr'al&_
dish_id&_drinB_id);
select ret into '_ret 2rom dishes where
id3_dish_id;
insert into L/4_+15L.
'alues$Sq_Logs.next'al&_nume&'_ret);
end log_add;
rocedure salar
$'_nume in 'archar(& '_salar out %umber)
is
'_n %umber;
begin
select sum$'anzare) into '_n 2rom log_table
where nume 3 '_nume;
'_salar #3 '_n;
end salar;
rocedure show_salaryes is
cursor em_cursor is
select distinct nume 2rom log_table;
salaru %umber;
begin
2or '_em_rec in em_cursor
loo
salar$'_em_rec.nume&salaru);
salaru#3salaru?@.1>;
D50S_/;+-;+.-;+_L<%.$salaru);
end loo;
end show_salaryes;
2unction taBe_2rom_StocB$'_nume
'archar(&'_cant %umber) return number
is
'_num number;
begin
select cantitate into '_num 2rom stocBs where
nume 3'_nume;
'_num#3'_num9'_cant;
udate stocBs set cantitate3'_num where
nume3'_nume;
return $'_num);
end taBe_2rom_StocB;
2unction g_to_Bg$'_num number)
return number
is
begin
return $'_num?@.@@1);
end g_to_Bg;
rocedure dish_stoc$'_nume in 'archar()
is
'_num number;
num number;
cursor em_ingr$'_numele 'archar() is select
ingredients.nume&ingredients.grama8 2rom
ingredients&dishes where rearat_id3dishes.id
and dishes.nume3'_numele;
begin
2or '_rec in em_ingr$'_nume)
loo
'_num#3g_to_Bg$'_rec.grama8);
num#3taBe_2rom_StocB$'_rec.nume&1);
dbms_outut.ut_line$:s9a luat:DD num DD: din
stocul de : DD '_rec.nume);
end loo;
excetion
when no_data_2ound then
D50S_/;+-;+.-;+_L<%.$:<mi are rau dar in stoc
nu mai exista ingrediente necesare entru a 2ace
rearatul dorit:);
end dish_stoc;
rocedure mareste_ortia$'_num in number)
is
cursor c_dish is select nume&ret&grama8&id 2rom
dishes;
cursor c_ingredients$num number) is select ?
2rom ingredients where rearat_id3num;
ortie_rea_mare excetion;
begin
2or rec_dish in c_dish
loo
i2 rec_dish.grama8?'_numG999 then
raise ortie_rea_mare ;
end i2;
dbms_outut.ut_line$rec_dish.numeDD:-retul 'a !
#:DD rec_dish.ret?'_num DD : si grama8ul 'a ! :DD
rec_dish.grama8?'_num);
2or rec_stocB in c_ingredients $rec_dish.id)
loo
dbms_outut.ut_line$:<ngredientele 'or ! :DD
rec_stocB.%;0.DD: si grama8ul :DD
rec_stocB.4F101H ?'_num);
end loo;
end loo;
excetion
when ortie_rea_mare
then dbms_outut.ut_line$:%u se oate ser'i
ortie de un Bilogram ne are rau...:);
end mareste_ortia;
rocedure arata_comenzi$'_num number)
is
cursor c_drinBs$num %umber) is select ? 2rom
drinBs where id3num;
cursor c_dishes$num %umber)is select ? 2rom
dishes where id3num;
cursor comands $num %umber)is select ? 2rom
comands where id3num;
begin
2or r_c in comands$'_num)
loo
dbms_outut.ut_line$:Comanda numarul # :DD
r_c.id);
dbms_outut.ut_line$: -rearat:);
2or r_dis in c_dishes$r_c.D<SJ.S_<D)
loo
dbms_outut.-ut_line$: : DDr_dis.nume);
end loo;
dbms_outut.ut_line$: 5autura:);
2or r_dri in c_drinBs$r_c.DF<%KS_<D)
loo
dbms_outut.-ut_line$: : DDr_dri.nume);
end loo;
end loo;
end arata_comenzi;
rocedure adauga
is
cursor dri is select ? 2rom drinBs where retN>;
cursor dish is select ? 2rom dishes where ret
N(@;
'_num number;
begin
2or r_c in dri
loo
'_num#3r_c.ret?1.@>;
udate drinBs
set ret3'_num where id3r_c.id;
dbms_outut.ut_line$:s9au modi!cat# :DD SOL
*F/PC/;%+DD: bauturi:);
end loo;
2or r_d in dish
loo
'_num#3r_d.ret?1.@>;
udate dishes
set ret3'_num where id3r_d.id;
dbms_outut.ut_line$:s9au modi!cat:DD SOL
*F/PC/;%+ DD : mancaruri:);
end loo;
end adauga;
end;

You might also like