Sunteți pe pagina 1din 47

Gestiunea unei Cofetarii

Proiect SGBD

Contents
Descrierea temei ............................................................................................................................................... 2 Schema conceptuala a bazei de date ............................................................................................................ 3 Interactiunea cu serverul Oracle prin intermediul comenzilor SQL (LDD si LMD) ............................................ 3 Comenzi LDD.................................................................................................................................................. 3 Comenzi LMD................................................................................................................................................. 5 Structuri alternative si repetitive .................................................................................................................... 10 Structuri alternative .................................................................................................................................... 10 Structuri repetitive ...................................................................................................................................... 13 Tratarea exceptiilor ......................................................................................................................................... 15 Exceptii pre-definite .................................................................................................................................... 15 Exceptii non-predefinite .............................................................................................................................. 18 Gestionarea cursorilor ..................................................................................................................................... 20 Cursori impliciti............................................................................................................................................ 20 Cursori Expliciti ............................................................................................................................................ 22 Funcii, proceduri, includerea acestora n pachete ......................................................................................... 25 Functii .......................................................................................................................................................... 25 Proceduri ..................................................................................................................................................... 29 Pachete ........................................................................................................................................................ 32 Triggeri ............................................................................................................................................................. 36 Machete de intrare (videoformate) .................................................................................................................. 38 Machete de iesire (rapoarte)........................................................................................................................... 43

Descrierea temei
Pentru realizarea acestui proiect am aplicat cunostintele dobandite de-a lungul cursului la teoria bazelor de date intr-o aplicatie cu caracter economic. Pentru a tine evidenta operatiunilor efectuate in gestionarea unei cofetarii, in acest proiect am decis sa utilizez o baza de date Oracle. Baza de date este compusa din 6 tabele cu legaturi intre ele,iar prin intermediul tabelelor descrise mai jos, este tinuta evidenta tranzactiilor, a angajatilor, a furnizorilor corespondent fiecarui produs, a clientilor si a comenzilor. Pentru creearea tabelelor si definirea legaturilor dintre ele s-a obtinut o baza de date dupa cum urmeaza: o o o o o Tabela angajati contine informatii despre angajatii ce lucreaza in aceasta cofetarie. Ea cuprinde date referitoare la nume, prenume, functie, e-mail, salariu, data angajarii, etc. Tabela furnizori contine furnizorii disponibili si activi pentru livrarea materiilor primie pentru cofetarie. Tabela clienti contine date despre clientii care au in aceasta cofetarie. Datele cuprind elemente ca nume, prenume, telefon si adresa. Tabela detalii tranzactii contine cantitatea produselor livrate, dar si detalii despre acesta. In tabela tranzactii avem date referitoarea la o tranzactie. O tranzactie are un angajat, un pacient si o tranzactiedar si data efectuarii tranzactiei.

Schema conceptuala a bazei de date

Interactiunea cu serverul Oracle prin intermediul comenzilor SQL (LDD si LMD)


Comenzi LDD
Creearea tabelelor Angajati CREATE TABLE ANGAJATI2( id_angajat number(4), nume varchar2(15), prenume varchar2(15), functia varchar2(15), data_angajare date, salariu number(10), email varchar2(20), data_nastere date, constraint angajati2_pk primary key(id_angajat) ); Furnizori CREATE TABLE Furnizori2( id_furnizor number(4), denumire_firma varchar2(15),

reprezentant_firma varchar2(15), nr_contact number(10), email varchar2(20), constraint furnizori2_pk primary key(id_furnizor) ); Produse CREATE TABLE Produse2( id_produs number(4), denumire varchar2(15), pret number(10), id_furnizor number(4), constraint produse2_pk primary key(id_produs), constraint produse2_fk foreign key (id_furnizor) references Furnizori2 ); Clienti CREATE TABLE Clienti2( id_client number(4), nume_client varchar2(15), prenume_client varchar2(15), nr_telefon number(15), adresa varchar2(40), constraint clienti2_pk primary key(id_client) ); Tranzactie CREATE TABLE Tranzactie2( id_tranzactie number(4), data_tranzactie date, id_client number(4), id_angajat number(4), constraint Tranzactie2_pk primary key(id_tranzactie), constraint Tranzactie2_fk1 foreign key (id_client) references Clienti2 , constraint Tranzactie2_fk2 foreign key (id_angajat) references Angajati2 ); Detalii Tranzactie CREATE TABLE Detalii_Tranzactie2(

id_tranzactie number(4), id_produs number(4), cantitate number(10), constraint Detalii_Tranzactie2_fk1 foreign key (id_tranzactie) references Tranzactie2, constraint Detalii_Tranzactie2_fk2 foreign key (id_produs) references Produse2 ); 1. Sa se creeze tabela Furnizori_Anulati in cadrul unui bloc PL/SQL. begin execute immediate 'create table Furnizori_Anulati as select * from furnizori2 where id_furnizor in (2,3)'; end; / select * from Furnizori_Anulati;

2. Sa se adauge la tabela Furnizori_Anulari o noua coloana(data_anulare), care arata data excluderii furnizorului din lista de furnizori. begin execute immediate 'alter table Furnizori_Anulati add data_anulare date'; end; / select * from furnizori_anulati;

3.Sa se adauge cheia unica a tabelei Furnizori_Anulati. begin execute immediate alter table Furnizori_Anulati add constraint codA_uk unique (CodA); end ; /

Comenzi LMD
Insert 1. Popularea tabelelor Angajati

insert into angajati2 values (1,'Popescu','Maria','Cofetar',TO_DATE('12.03.2004','DD.MM.YYYY'),1500, 'pmaria@yahoo.com',TO_DATE ('16.05.1985', 'DD.MM.YYYY') ); insert into angajati2 values (3,'Leon','Alina','Manager',TO_DATE('24.04.2006','DD.MM.YYYY'),2500, 'leonalina@yahoo.com',TO_DATE ('17.06.1980', 'DD.MM.YYYY') ); insert into angajati2 values (4,'Lazar','Claudia','Asistent',TO_DATE('26.09.2007','DD.MM.YYYY'),1000, 'lclaudia@yahoo.com',TO_DATE ('23.07.1980', 'DD.MM.YYYY') ); insert into angajati2 values (5,'Dascalu','Anca','Vanzator',TO_DATE('13.05.2007','DD.MM.YYYY'),1000, 'danca@yahoo.com',TO_DATE ('12.07.1974', 'DD.MM.YYYY') ); insert into angajati2 values (6,'Apostol','Andreea','Director',TO_DATE('09.05.2004','DD.MM.YYYY'),3000, 'aandreea@yahoo.com',TO_DATE ('25.06.1974', 'DD.MM.YYYY') ); insert into angajati2 values (7,'Iluca','Cezar','Curier',TO_DATE('08.11.2008','DD.MM.YYYY'),1200, 'icezar@yahoo.com',TO_DATE ('25.08.1986', 'DD.MM.YYYY') ); insert into angajati2 values (8,'Carabulea','Titi','Ingrijitor',TO_DATE('12.12.2012','DD.MM.YYYY'),1000, 'ctiti@yahoo.com',TO_DATE ('12.07.1986', 'DD.MM.YYYY') ); insert into angajati2 values (9,'Jugravu','Bogdan','Asistent',TO_DATE('07.12.2008','DD.MM.YYYY'),1500, 'jbogdan@yahoo.com',TO_DATE ('12.06.1987','DD.MM.YYYY') ); insert into angajati2 values (10,'Alexa','Diana','Vanzatoare',TO_DATE('12.07.2008','DD.MM.YYYY'),1500, 'adiana@yahoo.com',TO_DATE ('07.04.1987','DD.MM.YYYY') ); Clienti insert into clienti2 values (1,'Tudor','Ana',0756456734,'Bucuresti' ); insert into clienti2 values (2,'Ion','Alin',0756346734,'Arad' ); insert into clienti2 values (3,'Ionescu','Alex',0756346454,'Adjud' ); insert into clienti2 values (4,'Lazar','Cosmin',0723346454,'Alexandria' ); insert into clienti2 values (5,'Lautaru','Cristina',0723346564,'Bucuresti' ); Furnizori insert into furnizori2 values (1,'Spicul','Popescu',0723336564,'spicul@yahoo.com' ); insert into furnizori2 values (2,'Nutella','Leon',0745736564,'nutella@yahoo.com' ); insert into furnizori2 values (3,'Raureni','Lapusan',0745796564,'raurani@yahoo.com' ); insert into furnizori2 values (4,'Tefal','Lemnaru',0745796578,'tefal@yahoo.com' ); insert into furnizori2 values (5,'Metro','Apostol',0745236578,'metro@yahoo.com' ); Produse insert into produse2 values (1,'Tort',45,5 ); insert into produse2 values (2,'Budinca',10,2 ); insert into produse2 values (3,'Clatite',10,1 ); insert into produse2 values (4,'Negresa',15,5 );

insert into produse2 values (5,'CupCakes',25,5 ); insert into produse2 values (6,'Macarons',30); Tranzactie insert into tranzactie2 values (1,TO_DATE('11.12.2012','DD.MM.YYYY'),2,5 ); insert into tranzactie2 values (2,TO_DATE('08.12.2011','DD.MM.YYYY'),1,7 ); insert into tranzactie2 values (3,TO_DATE('08.08.2011','DD.MM.YYYY'),5,3 ); insert into tranzactie2 values (4,TO_DATE('18.06.2012','DD.MM.YYYY'),3,3 ); insert into tranzactie2 values (5,TO_DATE('23.06.2012','DD.MM.YYYY'),3,8 ); insert into tranzactie2 values (6,TO_DATE('23.03.2000','DD.MM.YYYY'),4,7 ); insert into tranzactie2 values (7,TO_DATE('13.03.2007','DD.MM.YYYY'),2,3 ); Detalii tranzactie insert into detalii_tranzactie2 values (7,3,4 ); insert into detalii_tranzactie2 values (5,2,7 ); insert into detalii_tranzactie2 values (1,6,10 ); insert into detalii_tranzactie2 values (2,1,1 ); insert into detalii_tranzactie2 values (3,2,3 ); insert into detalii_tranzactie2 values (4,4,2 ); insert into detalii_tranzactie2 values (6,5,3 );

2. Sa se adauge clientul Ionescu Razvan. Datele personale (nr de telefon, adresa ) se vor citit de la tastatura,id-ul acestuia va avea valoarea ultimului id client incrementat cu o unitate. set serveroutput on declare v_id clienti2.id_client%TYPE; begin select max(id_client) into v_id from clienti2; insert into clienti2 values (v_id+1, '&nume', '&prenume', &nr_telefon,'&adresa'); End; / select * from clienti2;

Update 1.Sa se mareasca cantitatea de produse livrata cu 100 bucati. Begin Update detalii_tranzactie2 set cantitate=nvl(cantitate,0)+100; END; / select * from detalii_tranzactie2;

Delete 1.Angajatul care are id-ul 1, a demisionat.Sa se stearga angajatul din tabela Angajati2. begin delete from angajati2 where id_angajat=1; End; / Inainte de a efectua stergerea:

Dupa stergere:

2.Angajatii care au salariul 3000 de lei nu mai primesc pentru o luna salariul, acesta se echivaleaza in produse alea cofetariei. Sa se stearga angajatul care are salariul=3000 begin delete from angajati2 where salariu=3000; end; / select * from angajati2;

Structuri alternative si repetitive


Structuri alternative
1.Sa se modifice cantitatea livrariilor produsului cu codul 1 daca s-au efectuat mai livrari mai putine de 30. Aceasta instructiune va afisa pe ecran modificarile. set serveroutput on declare v_cant detalii_tranzactie2.cantitate%type; begin select cantitate into v_cant from detalii_tranzactie2 where id_tranzactie=1; dbms_output.put_line('Cantitatea initiala este: '||v_cant); if v_cant < 30 Then v_cant:=2* v_cant; elsif v_cant between 5 AND 10 THEN v_cant:=1.5*v_cant; else v_cant:=1.25* v_cant; end if; dbms_output.put_line('Cantitatea finala este: '||v_cant); end; /

2. In urma efectuarii unor ore suplimentare, sa se mareasca salariul angajatului cu id 3, in urmatorul fel: -daca salariul<1000, se mareste cu 10%; -daca salariul este intre 1000 si 2000, se mareste cu 15%; -daca salariul>2000, se mareste cu 20%; declare v_sal angajati2.salariu%type; begin select salariu into v_sal from angajati2 where id_angajat=3; dbms_output.put_line('Salariul initial este:'||v_sal); if v_sal<1000 then v_sal:=1.1*v_sal; elsif v_sal between 1000 and 2000 then v_sal:=1.15*v_sal; else v_sal:=1.2*v_sal;

end if; dbms_output.put_line('Salariul final este:'||v_sal); end; /

3. Deoarece s-a marit TVA-ul, este necesara o marire a pretului produsului 8.Folosind instructiunea case sa se mareasca pretul produsului cu id 6 astfel: -daca pretul este mai mic de 10 cu 25%; -daca pretul este intre 10 si 20 cu 15%; -daca pretul este mai mare de 45 cu 10 %; declare v_pret produse2.pret%type; begin select pret into v_pret from produse2 where id_produs=6; dbms_output.put_line('Pretul initial este:'||v_pret); case when v_pret<10 then v_pret:=v_pret*1.25; when v_pret between 10 and 20 then v_pret:=v_pret*1.15; else v_pret:=v_pret*1.1; end case; dbms_output.put_line('Pretul final este:'||v_pret);

end; /

Structuri repetitive
1. Pentru a putea da anumite prime angajatilor de Sarbatori, sa se afiseze in ordine angajatii cu codurile in intervalul 1-10 atat timp cat salariul acestora este mai mare decat salariul mediu. Se va folosi structura WHILE...LOOP...END LOOP: declare v_sal angajati2.salariu%type; v_salMediu v_sal%type; i number(4) :=1; Begin Select avg(salariu) into v_salmediu from angajati2; dbms_output.put_line('Salariul mediu este:'||v_salmediu); While i<10 loop select salariu into v_sal from angajati2 where id_angajat=i; dbms_output.put_line('Salariatul cu codul ' || i || ' are salariul: '||v_sal); i:=i+1; exit when v_sal>v_salmediu; end loop; end; /

2. Sa se afiseze numarul de furnizori ale fiecarui produs al carui id este situate in intervalul 1..3, dar sa se intreupa afisarea in cazul in care se gaseste primul produs din acest interval care nu are niciun furnizor: set serveroutput on declare v_nr number; v_nume furnizori2.denumire_firma%type; v_id produse2.id_furnizor%type; begin for v_id in 1..3 loop v_nr:=0; select count(c.id_produs) into v_nr from produse2 c,furnizori2 a where c.id_furnizor=a.id_furnizor and a.id_furnizor=v_id; dbms_output.put_line('Produsul cu id-ul:'||' '||v_id||' '||'are:'||' '||v_nr||' '||'furnizori'); exit when v_nr=0; end loop; end; /

Tratarea exceptiilor
Exceptii pre-definite
1.Sa se afiseze angajatul cu codul 12. Sa se trateze eroarea aparuta in cazul in care nu exista nici un angajat cu acest cod set serveroutput on declare v_nume varchar2(20); begin select nume into v_nume from angajati2 where id_angajat=12; dbms_output.put_line(v_nume); exception when no_data_found then dbms_output.put_line('Nu exista angajatul cu acest ID!'); End; /

2.Sa se afiseze angajatul cu prenumele Anca , apoi sa se trateze eroarea aparuta in cazul in care nu exista mai multi angajati cu aceleasi nume( interogarea sql din bloc introduce mai multe inregistrari): set serveroutput on declare sal angajati2.salariu%type; Begin select salariu into sal from angajati2 where prenume='Anca'; dbms_output.put_line('Anca are salariul de: '||sal); exception when too_many_rows then dbms_output.put_line('Exista mai multi salariati cu prenumele de Anca! Utilizati un cursor pentru selectie!'); End; /

3. Sa se afiseze denumirea firmei cu numarul de contact citit de la tastatura : 0745736564 : declare v_denumire_firma furnizori2.denumire_firma%type; begin select denumire_firma into v_denumire_firma from furnizori2 where nr_contact=&nr_contact; dbms_output.put_line('Furnizorul este: '||v_denumire_firma); exception when no_data_found then dbms_output.put_line('Furnizorul nu exista.'); end; /

4.Sa se afiseze toti furnizorii cofetariei. Sa se trateze o exceptie. declare cursor c is select * from furnizori2; den_rec furnizori2%rowtype; begin open c;

open c; loop fetch c into den_rec; dbms_output.put_line('Denumire '||den_rec.denumire_firma||' categorie '||den_rec.id_furnizor); exit when c%notfound; end loop; close c; exception when cursor_already_open then dbms_output.put_line('Cursorul este deja deschis'); end; /

Exceptii non-predefinite
1. Sa se mareasca salariul angajatului cu 200 lei al carei functie este de Curier: declare excep2 exception; pragma exception_init(excep2,-20999); begin update angajati2 set salariu=salariu+200 where functia='Curier'; if sql%notfound then raise_application_error(-20999,'Functie invalida!'); end if; exception when excep2 then dbms_output.put_line('Nu exista angajati cu acesta functie'); end;

/ select * from angajati2; Inainte de a efectua modificarea:

Dupa marirea salariului:

2.In urma unei campanii publicitare, cofetaria are un nou client, sa se adauge noul client in tabela clienti2 declare exceptie_inserare exception; pragma exception_init(exceptie_inserare,-01400); begin INSERT INTO clienti2 VALUES('11','Moraru','Larisa',0756746734,'Timisoara' ); exception when exceptie_inserare then dbms_output.put_line('Restrictie de inregistrare incalcata'); end;

Gestionarea cursorilor
Cursori impliciti
1.Meniul cofetariei s-a modificat, astfel ca un produs a fost scos. Sa se stearga produsul din tabela produse2 si sa se contorizeze numarul de randuri sterse. Lista Produse initial:

set serveroutput on declare v_rez NUMBER(2); begin delete from produse2 where id_produs=4; v_rez:=SQL%ROWCOUNT; dbms_output.put_line(v_rez || 'randuri sterse'); commit;

end; /

2.Sa se modifice numele clientului cu id-ul introdus de la tastatura. In cazul in care nu exista clientul, sa se trateze in mod corespunzator. Lista clienti inainte de modificare:

set serveroutput on accept val prompt 'Dati id-ul clientului: '; begin update clienti2 set nume_client='Anghel' where id_client=&val; if sql%notfound then dbms_output.put_line('NU exista clientul cu acest id!'); end if; end; / Dupa modificare:

3.Sa se majoreze cu 50% preturile produselor care au pretul de vanzare mai mic decat 20: declare v_rez number(2); BEGIN update produse2 set pret = 1.5*pret where pret<20; v_rez:=SQL%ROWCOUNT; DBMS_OUTPUT.PUT_LINE (v_rez || ' randuri actualizate'); END; /

Cursori Expliciti
1.Sa se afiseze lista cu numele si prenumele clientilor din Bucuresti folosind un cursor explicit. set serveroutput on declare cursor cli_cursor is select id_client, nume_client, prenume_client from clienti2 where adresa like '%Bucuresti';

cli_rec cli_cursor%rowtype; begin dbms_output.put_line('Lista cu numele si prenumele clientilor din Bucuresti'); open cli_cursor; loop fetch cli_cursor into cli_rec; exit when cli_cursor%notfound; dbms_output.put_line('Clientul cu numele ' || cli_rec.nume_client ||'si prenumele ' || cli_rec.prenume_client || ' din Bucuresti.'); end loop; close cli_cursor; end; /

2.Sa se afiseze produsele care au pretul minim de 10lei, primit ca parametru de cursor: declare cursor c2(p_pret NUMBER) is select denumire from produse2 where pret>p_pret; v_denumire produse2.denumire%type; v_pret number(2); begin v_pret:=10; dbms_output.put_line('Produsele care au cel putin '|| 'pretul 10:'); if not c2%isopen then open c2(v_pret); end if;

loop fetch c2 into v_denumire; exit when c2%notfound; dbms_output.put_line (v_denumire); END LOOP; CLOSE c2; END; /

3.Pentru a verifica numarul de clienti ai angajatilor, sa se afiseze angajatii care au avut comenzi de la clientii cu id_client=2: set serveroutput on declare cursor angajat (id_angajat number) is select nume,prenume from angajati2 where angajati2.id_angajat=2; v_angajat angajat%rowtype; begin dbms_output.put_line('Lista angajati care au avut comenzi de la cod client 2:'); open angajat(&id_angajat); loop fetch angajat into v_angajat; exit when angajat%notfound; dbms_output.put_line('Angajatul: '||v_angajat.nume||' '||v_angajat.prenume); end loop; exception when invalid_cursor then dbms_output.put_line('Cursorul nu a fost deschis! Nu se pot afisa angajatii. '); end; /

Funcii, proceduri, includerea acestora n pachete


Functii
1..Sa se creeze o functie care afiseaza numarul total de tranzactii. create or replace function total_tranzactii return number is nrtotal number:=0; begin select count(*) into nrtotal from detalii_tranzactie2; return nrtotal; end; / show errors;

Verificare: set serveroutput on declare a number; begin a:=total_tranzactii(); dbms_output.put_line('Numar total tranzactii:' ||a); end;

/ show errors; 2. Sa se stearga produsele care au pretul mai mic decat o valoare citita si sa se afiseze numarul de produse sterse. create or replace function sterge(v_pret produse2.pret%type) return number is v_sterse number(10); begin delete from produse2 where pret<v_pret; v_sterse:=sql%rowcount; return v_sterse; exception when no_data_found then return 0; end; /

Verificare: set serveroutput on declare n number (10,50); begin n:=sterge(1); dbms_output.put_line(n||' '||'produse sterse'); end;

3. Sa se afiseze, prin intermediul unei functii daca angajatii au salariu mai mic decat media salariilor. set serveroutput on create or replace function verificare_salariu (p_id_ang in angajati2.id_angajat%type, p_salariu_mediu in number) return boolean is v_sal angajati2.salariu%type; begin select salariu into v_sal from angajati2 where id_angajat=p_id_ang; if v_sal > p_salariu_mediu then return true; else return false; end if; exception when no_data_found then return null; end; / show errors;

Verificare:
set serveroutput on declare cursor angajatin is select id_angajat, nume, prenume,salariu from angajati2; rec_angn angajatin%rowtype; v_salariu_mediu number(4); minim number(2); begin open angajatin; select avg(salariu) into v_salmediu from angajati2; select min(id_angajat) into minim from angajati2; for i in 1..minim loop fetch angajatin into rec_angn; if verificare_salariu(rec_angn.id_angajat, v_salmediu) then dbms_output.put_line('Angajatul '||rec_angn.nume||' '||rec_angn.prenume||' are salariul de '||rec_angn.salariu||' mai mare decat media'); else dbms_output.put_line('Salariatul cu id-ul '||rec_angn.id_angajat||' are salariul mai mic decat salariul mediu!'); end if;

end loop; close angajatin; end; /

Proceduri
1.Sa se creeze o procedura care calculeza salariul mediu si il returneaza printr-un parametru de tip OUT: create or replace procedure salariu_mediu (p_salariu_mediu out number) is begin select AVG(salariu) into p_salariu_mediu from angajati2; end; / show error;

Verificare: Execute variable v_salariu_mediu number execute salariu_mediu(:v_salariu_mediu) print v_salariu_mediu

2. Sa se afiseze produsele care au numarul de furnizori comandate mai mic decat 2.

set serveroutput on create or replace procedure info_produse(p_id in produse2.id_produs%type, p_cant out detalii_tranzactie2.cantitate%type) is begin select cantitate into p_cant from detalii_tranzactie2 where id_produs=p_id and detalii_tranzactie2.cantitate<2; end; / show errors;

Verificare: set serveroutput on declare cursor cp is select id_produs.cantitate from detalii_tranzactie2; cant number(4); c_rec ca%rowtype; begin cant:=0; open cp; loop fetch cp into c_rec; info_produse(c_rec.id_produs,cant); if cant<2 then dbms_output.put_line(c_rec.id_produs||' '||c_rec.cantitate); else dbms_output.put_line('Eroare'); end if; end loop; end; / 3.Sa se afle numele si adresa unui client, pentru aceasta trebuie sa se realizeze o procedura ce primeste ca parametru de intrare id-ul unui client si returneaza numele si adresa.
create or replace procedure cauta_client (p_id_client in clienti2.id_client%type,p_nume OUT clienti2.nume_client%type,p_adresa OUT clienti2.adresa%type) is begin select nume_client, adresa into p_nume,p_adresa from clienti2 where id_client=p_id_client; end; / show errors;

Executie: set serveroutput on declare v_nume clienti2.nume_client%type; v_adresa clienti2.adresa%type; begin cauta_client(3,v_nume,v_adresa); dbms_output.put_line('Clientul '||v_nume||' sta in orasul: '||v_adresa); end; /

Pachete
Creearea pachetului: create or replace package pachet is function sterge(v_pret produse2.pret%type) return number; function verificare_salariu(p_id_angajat angajati2.id_angajat%type) return boolean; function total_tranzactii return number; procedure salariu_mediu (p_salariu_mediu out number); procedure cauta_client (p_id_client in clienti2.id_client%type,p_nume OUT clienti2.nume_client%type,p_adresa OUT clienti2.adresa%type); end; / show errors;

Codul pachetului: set serveroutput on create or replace package body pachet is function sterge(v_pret produse2.pret%type) return number is v_sterse number(10); begin delete from produse2 where pret<v_pret; v_sterse:=sql%rowcount; return v_sterse; exception when no_data_found then return 0; end; function verificare_salariu (p_id_ang in angajati2.id_angajat%type, p_salariu_mediu in number)

return boolean is v_sal angajati2.salariu%type; begin select salariu into v_sal from angajati2 where id_angajat=p_id_ang; if v_sal > p_salariu_mediu then return true; else return false; end if; exception when no_data_found then return null; end; function total_tranzactii return number is nrtotal number:=0; begin select count(*) into nrtotal from detalii_tranzactie2; return nrtotal; end; procedure salariu_mediu (p_salariu_mediu out number) is begin select AVG(salariu) into p_salariu_mediu from angajati2; end; procedure cauta_client

(p_id_client in clienti2.id_client%type,p_nume OUT clienti2.nume_client%type,p_adresa OUT clienti2.adresa%type) is begin select nume_client, adresa into p_nume,p_adresa from clienti2 where id_client=p_id_client; end;

end; / show errors;

Executia: declare v_id_angajat angajati2.id_angajat%type:=&pid_angajat; begin if pachet.verificare_salariu(v_id_angajat) then dbms_output.put_line('Angajatul cu id '||v_id_angajat||' are salariu mai mic decat media salariilor.'); else dbms_output.put_line('Angajatul cu id '||v_id_angajat||' are salariu mai mic decat media salariilor.'); end if; end; / show errors; declare nume_client varchar2(20); adresa varchar2(20); id_client number(4); begin pachet.cauta_client(1,nume_client,adresa);

dbms_output.put_line(nume); end; / variable pachet.v_salariu_mediu number execute salariu_mediu(:v_salariu_mediu) print v_salariu_mediu declare a number; begin a:=pachet.total_tranzactii(); dbms_output.put_line('Numar total tranzactii:' ||a); end; / show errors; declare n number (10,50); begin n:=pachet.sterge(1); dbms_output.put_line(n||' '||'produse sterse'); end; /

Triggeri
1.Sa se creeze un trigger care sa se declanseze inainte de stergerea datelor din tabela produse2. CREATE OR REPLACE TRIGGER prod_trig BEFORE DELETE ON produse2 BEGIN dbms_output.put_line('triggerul s-a executat'); END; /

3. Sa se creeze un trigger pentru a nu se permite depasirea unei limite maxime a pretului unui produs create or replace trigger restrict_pret before insert or update on produse2 for each row declare v_pret_max number; begin select pret into v_pret_max from produse2 where id_produs=:new.id_produs; if:new.pret>v_pret_max then raise_application_error(-04091,'Nu se poate depasi pretul maxim pentru id dat'); end if; end; / show errors;

3. Sa se creeze un trigger care sa se declanseze inainte de inserarea de noi date in tabela furnizori2. CREATE OR REPLACE TRIGGER insert_trigger BEFORE INSERT ON furnizori2 BEGIN

RAISE_APPLICATION_ERROR (-20004, 'Nu se pot insera date!'); END; / SHOW ERRORS INSERT INTO furnizori2 values (20, 'Milka','Fraga',0745466564,'fraga@yahoo.com' );

Machete de intrare (videoformate)


1. Sa se creeze un formular pentru inserarea datelor in tabela produse2. Folosind aplicatia Application Express se pot crea formulare de inserare a datelor.

Se parcurc pasii si se completeaza denumirea schemei:

Se Adauga o noua pagina:

Se creeaza aplicatia:

Dupa ce am creeat aplicatia, se selecteaza butonul Run Aplication, trebuie sa ne autentificam cu datele personale.

Dupa autentificare, va fi afisata lista cu datele din tabele produse2.

Pentru a adauga date, se da click pe Create, iar pentru a putea face vizibil campul id_produs se da click in josul paginii pe Edit page3.

Se pot adauga inregistrari noi in tabela.

2. Sa se creeze un formular pentru inserarea datelor in tabela angajati2

Se creeaza aplicatia

Pentru a putea face vizibil capul id_angajat. Trebuie sa editam pagina3.

Introducem datele:

Machete de iesire (rapoarte)


1. Sa se afiseze angajatii care au salariul mai mic decat suma de 1000 de lei. Se selecteaza tabela pe care se vor face interogarile( angajati2), se selecteaza optiunea Filter din mediul Actions de unde se aleg criteriile upa care se vor face afisarile datelor.

Se adauga conditia de filtrare

Rezultatul:

2.

Sa se afiseze angajatii care nu au id_angajat=2;

Rezultatul:

S-ar putea să vă placă și