Academia de Studii Economice

Bucureşti

Cibernetică, Statistică şi
Informatică Economică

Disciplina: SGBD

Numele firmei: S.C. APISALECOM S.R.L.

Student: Alecu Cristian
Grupa 1022
Seria A
Profesor: Vlad Diaconiţa

SGBD

Scurtă prezentare a firmei
Înfiinţată în anul 1993, firma S.C. Apisalecom S.R.L. este
situată în oraşul Comăneşti, judeţul Bacău. Firma proceseaza
din anul 2003, odata cu obţinerea licenţei de fabricaţie,
produse apicole (miere de albine, polen, propolis, ceara,
tinctura de propolis). Principalul produs ambalat este mierea,
livrată sub forma a patru sortimente distincte: salcâm, tei,
munte si polifloră. În acest moment, mierea este ambalată in
borcane din sticlă având conţinutul de 400g net. Din anul 2006,
am inceput livrările către o serie de firme de produse
farmaceutice si cosmetice naturale, a materiei prime sub
denumirea: Propolis brut in stare naturală. Creşterea
vânzărilor a fost serioasă ajungând acum principalul lor
furnizor de propolis si ceară. Acelaşi propolis prelucrat de noi
este vândut en-detail şi sub formă de tinctură la sticluţe de
20ml sau bulgăre la pacheţele de 10 g. Vânzările se fac prin
firme de distribuţie produse naturiste in număr de şapte: trei
in Bucureşti, două în Vaslui, una în Bacău şi una în Galaţi,
acestea având ponderea principală a vânzărilor. Materia primă
este achiziţionată în mare parte de la producătorii particulari
pe bază de borderouri de achiziţie iar plata se face cu O.P. sau
numerar. Zona acoperită este destul de largă dar in principal
achiziţia o facem din Ardeal. O altă parte a materiei prime se
obţine din stupina proprie. În acest moment deţinem un număr
de 180 de familii de albine achiziţionate prin program SAPARD.
Spaţiul pe care îl deţinem în acest moment este de aproximativ
450 de metri patraţi şi ne permite ambalarea a cca. 1.000 de
borcane cu miere pe zi, cu ajutorul a nouă persoane angajate.
Mierea este subsţanta zaharoasă pe care o produc albinele prin
colectarea nectarului floral şi extrafloral sau a unui alt suc luat
de pe plantele vii, prin transformarea lui, sub acţiunea
enzimatică a salivei şi a sucului gastric al albinelor. În timpul
depozitării nectarului în celule, apa care este în plus va fi
îndepărtată prin ventilare. Mierea conţine 20% apă. Pentru a
obţine 1 litru de miere, sunt necesare 5 kg de nectar. Pentru a
obţine 1 kg de nectar, este nevoie de 20.000 - 100.000 de
zboruri. Un roi de albine (30.000-60.000) poate fabrica 1kg de
2

Clienţi. id_angajat NUMBER(5) ).2% apă. cantitate NUMBER(8) ). 31. 100 de grame de zahăr conţin 0.5% zaharoză si 6. cu ajutorul funcţiei CREATE TABLE: create table PRODUSE (id_produs number(5). create table COMENZI (nr_comanda NUMBER(12). 3 . care cuprinde 5 tabele: Angajaţi. (furnizeaza 335 de calorii) conţin 17. Comenzi. stare_comanda VARCHAR2(25). pret NUMBER(8.2) ). 6. Scopul bazei de date Pentru a gestiona cu usurinţă informaţiile legate de produsele şi comenzile diferiţilor clienţi. prenume VARCHAR2(20) not null. id_produs NUMBER(5) not null. 38.SGBD miere pe zi. nume VARCHAR2(20) not null. pret_lista number(8.28% glucoză.83% maltoză şi alte dizaharide. create table ANGAJATI (id_angajat NUMBER(5). id_client NUMBER(5).1% apă si 99.9% zaharoză. am folosit codul de mai jos. Pentru crearea tabelelor. 100 de grame de miere.19% fructoză. create table RAND_COMENZI ( nr_comanda NUMBER(12). cantitate_produs number(8). am creat această bază de date. Produse şi Rând Comenzi. Prin comparaţie. descriere varchar(500). data_comanda DATE. denumire_produs varchar2(30) not null.2).

id_produs). ALTER TABLE RAND_COMENZI ADD CONSTRAINT id_produs_fk FOREIGN KEY (id_produs) REFERENCES PRODUSE(id_produs). create table CLIENTI ( id_client NUMBER(5).SGBD email VARCHAR2(25) unique. ALTER TABLE RAND_COMENZI ADD CONSTRAINT pk_rand_comenzi PRIMARY KEY(nr_comanda. am folosit următoarele funcţii: ALTER TABLE PRODUSE ADD CONSTRAINT pk_produse PRIMARY KEY(id_produs). email_client VARCHAR2(30) not null ). cod_fiscal VARCHAR2(15). telefon VARCHAR2(20) unique. ALTER TABLE PRODUSE ADD CONSTRAINT ck_produse CHECK(descriere IS NOT NULL). ALTER TABLE ANGAJATI 4 . ALTER TABLE COMENZI ADD CONSTRAINT pk_nr_comanda PRIMARY KEY(nr_comanda). Iar ca restricţii. strada_client VARCHAR2(30). ALTER TABLE ANGAJATI ADD CONSTRAINT salariul_min CHECK(salariul>0). ALTER TABLE COMENZI ADD CONSTRAINT id_client_fk FOREIGN KEY(id_client) REFERENCES CLIENTI(id_client). ALTER TABLE RAND_COMENZI ADD CONSTRAINT nr_comanda_fk FOREIGN KEY (nr_comanda) REFERENCES COMENZI(nr_comanda). numar_client NUMBER(5). nume_client VARCHAR2(20). data_angajare DATE.2) ). salariul NUMBER(8. ALTER TABLE COMENZI ADD CONSTRAINT id_angajat_fk FOREIGN KEY(id_angajat) REFERENCES ANGAJATI(id_angajat). telefon_client VARCHAR2(15) not null. ALTER TABLE ANGAJATI ADD CONSTRAINT pk_id_angajat PRIMARY KEY(id_angajat).

'Miere tei'.16).100.'.10.11. 'Miere de albine. INSERT INTO PRODUSE VALUES(5. 'Miere de albine. 'Miere de albine.'Polen granule'.'.'. INSERT INTO PRODUSE VALUES(7. ALTER TABLE CLIENTI ADD CONSTRAINT id_client_pk PRIMARY KEY(id_client).'Miere salcam'.92).SGBD ADD CONSTRAINT data_angajare_nn CHECK(data_angajare is not null). 'Miere de albine.'Miere salcam'.11. 'Antibiotic natural'. ALTER TABLE CLIENTI ADD CONSTRAINT email_client_u UNIQUE(email_client).68).'Propolis brut'. ALTER TABLE CLIENTI ADD CONSTRAINT nume_client_nn CHECK(nume_client is not null). 'O minune a vietii'.44).19).'.400.7.9. INSERT INTO PRODUSE VALUES(4.7.'. INSERT INTO PRODUSE VALUES(6. INSERT INTO PRODUSE VALUES(2.78). INSERT INTO PRODUSE VALUES(3.400.7.'Miere munte'.350.400. 5 .19).'Miere poliflora'. Pasul următor a fost de a insera inregistrări în tabele folosind funcţia INSERT: INSERT INTO PRODUSE VALUES(1. 'Miere de albine.400.8.

54).ro'.02.9).5. INSERT INTO RAND_COMENZI VALUES(13.4.7. INSERT INTO RAND_COMENZI VALUES(11.7.1.50).7.40).2013'. INSERT INTO RAND_COMENZI VALUES(16. INSERT INTO RAND_COMENZI VALUES(7. expediata'.8.'04.4.250).480).2).1993'.19.'ion.4).' INSERT INTO COMENZI VALUES(15.160). INSERT INTO RAND_COMENZI VALUES(1. finalizata'.02. 'Ceara depilatoare naturala.SGBD INSERT INTO PRODUSE VALUES(8.4.2012'.700).2012'. 6 .'Ion'.' INSERT INTO COMENZI VALUES(9.10.1000.2013'. INSERT INTO RAND_COMENZI VALUES(12.84.'02.andrei@apisalecom.07. INSERT INTO PRODUSE VALUES(10. COMMIT. INSERT INTO PRODUSE VALUES(11.19.2012'.2.8.7.1).06.'04.'18.' INSERT INTO COMENZI VALUES(7. finalizata'.09.'16.3).2012'.15).54.4.2012'. INSERT INTO RAND_COMENZI VALUES(5.92.2012'.68. INSERT INTO RAND_COMENZI VALUES(2.19.2012'.6.1850).02.645).10.44.1).2.2012'.30).11.3. INSERT INTO RAND_COMENZI VALUES(14.20.' INSERT INTO COMENZI VALUES(12.' INSERT INTO COMENZI VALUES(3.78.01.02.' INSERT INTO COMENZI VALUES(10.'15.01.7).2013'.1).8).' INSERT INTO COMENZI VALUES(6.2012'.1. finalizata'.6.2).01.110).4.2013'.' INSERT INTO COMENZI VALUES(2.'30.5. finalizata'.4.' INSERT INTO COMENZI VALUES(5.'. INSERT INTO RAND_COMENZI VALUES(4.'Fagure din stup.6.8). INSERT INTO RAND_COMENZI VALUES(10.3.8.7.3).7.'03.19.9.14).4. INSERT INTO RAND_COMENZI VALUES(8.90).5).'Ceara depilatoare'. anulata'.10.9.7. finalizata'.10.190).78).' INSERT INTO COMENZI VALUES(11.'Tinctura de propolis'.78.900).03.7. finalizata'.19.4. finalizata'. INSERT INTO RAND_COMENZI VALUES(6.2012'.04.' INSERT INTO COMENZI VALUES(4.2012'. 'Antibiotic natural'.11. finalizata'.9.06.' INSERT INTO COMENZI VALUES(14.19.'15.5.10.01.11.16.3.01.' INSERT INTO COMENZI VALUES(8.3.84. INSERT INTO PRODUSE VALUES(12.'16.'Apiinvert'. anulata'. 'Hrana pentru albine in stare solida'. 'Andrei'.06).3).11.' INSERT INTO COMENZI VALUES(13.2012'.'05. expediata'.8. INSERT INTO RAND_COMENZI VALUES(3.1200). 'Sirop de albine'.84).' commit.'14. INSERT INTO COMENZI VALUES(1.4).12. finalizata'.'30. INSERT INTO RAND_COMENZI VALUES(15.02.'15.1000.'0744128488'.1.200.3.2.'Fagure'.'.9.7.2.1000.'Apifonda'. INSERT INTO RAND_COMENZI VALUES(9.'21.11. finalizata'.84). INSERT INTO ANGAJATI VALUES(1. finalizata'. anulata'.' INSERT INTO COMENZI VALUES(16. COMMIT.3).02.'02.'15. INSERT INTO PRODUSE VALUES(9.90).

COMMIT.C.'.' 0217755'.'0765890775'.ro'.03.' 021890667'.2011'.'radix.'0743442908'. INSERT INTO ANGAJATI VALUES(7.'17.'Chirtes'.116.'12.ro').89.'stefan_b@apisalecom. BELLA-DONNA S.2480).'stoilescu. INSERT INTO CLIENTI VALUES(2. INSERT INTO CLIENTI VALUES(3.07.srl@yahoo.357.L.R. INSERT INTO ANGAJATI VALUES(4.' Veteranilor'.'Vasile'.'.R.1996'.ro'.'S.'0733978544'.ro'.'S.C.1999'.'ign_dorel@yahoo. PDG S. 'Stoian'.'Ioana'.C.1900).'0723857425'. 'RO 7124124'. INSERT INTO CLIENTI VALUES(7.'popescu_laura12@apisalecom.A.ro').'0742789182'. TIS FARMACEUTIC S.R.'Stefan'.1900).'.' Bulevardul Unirii'.'pdg_group@pdg.'S. RADIX S.com').'Dorel'.'.1998'.'Miruna'.'.14.'fanelc@apisalecom.com').' 021885647'.'APIDAVA S.'. INSERT INTO CLIENTI VALUES(5. 'Stoilescu'.'10.12.'ioanab@apisalecom.L.'stoianvasi@apisalecom. INSERT INTO ANGAJATI VALUES(3.248.' 0753990012'.'0741886675'.C. INSERT INTO ANGAJATI VALUES(8.' 0765422108'.' 021867768'. 'RO 644921'. INSERT INTO CLIENTI VALUES(1.L.'ONEDIA DISTRIBUTION S.2004'.' Soseaua de centura'.3650). INSERT INTO ANGAJATI VALUES(5. INSERT INTO CLIENTI VALUES(6.R.SGBD INSERT INTO ANGAJATI VALUES(2.'0741123456'.ro'.'S.2000'.com'.'Andreea'.1997'.'brotacel_srl@brotacel.'belladonna_1@yahoo.' Industriilor'.2800).55.' Bulevardul Stefan cel Mare'. INSERT INTO CLIENTI VALUES(4. 'Ignat'. 'RO 855098'.' Mihai Viteazul'.10.com').ro'.01. INSERT INTO ANGAJATI VALUES(9.'04. 'Baciu'.A. 'Popescu'.'tisfarma@tis. 'RO 1672885'.'04.2950).L.'S. INSERT INTO ANGAJATI VALUES(6.m@apisalecom.2640).'apidava@api. BROTACEL S.L.'25.ro').andreea@apisalecom. 7 .79.'onediad@onedia.' Soseaua de centura'.'Laura'.'30.'0744095518'. 'RO 234221'.'29.R. 'RO 779952'.' 021664455'.06.03. 'Saulea'. 'RO 867552'.ro'.C. 'Stefan'.ro').1994'.11. COMMIT. 'Badea'.'.'saulea.ro'.1550).

END. END. set serveroutput on BEGIN execute immediate 'CREATE table PRODUSE2 AS SELECT * FROM PRODUSE'. DECLARE v_sir varchar2(50). Afișați rezultatul. În tabela nou creată (Produse 2 ). BEGIN v_sir:='ALTER TABLE PRODUSE2 add (Stoc number (7))'. / 2. 8 . Să se creeze o nouă tabelă „Produse2” care să conțină aceleași produse ca și tabela inițială.put_line (v_sir). să se adauge o coloană cu numele „Stoc”. dbms_output. / select * from PRODUSE2.SGBD Exerciţii: 1. EXECUTE IMMEDIATE v_sir.

2.nume%TYPE. Să se mărească cu 20% salariul angajaților care au în prezent salariul mai mic de 2000 de RON. BEGIN update angajati 9 .put_line('Angajatul :' || v_nume||). DECLARE v_nume angajati. Să se afișeze numele angajatului cu codul 2. END. DECLARE v_procent number:=0. / 4.SGBD 3. BEGIN select nume into v_nume from angajati where id_angajat = 2.salariul%type:=200. v_prag angajati. dbms_output.

Selectați produsele și prețul acestora pentru acelea care au prețul mai mic decât prețul mediu al produsului cu codul 2 fără a utiliza comanda select. / 10 . dbms_output. 6. Să se afișeze numărul de comenzi ale angajatului al cărui cod este introdus de la tastatură.SGBD set salariul=salariul*(1+v_procent) where salariul < v_prag. / 5. END. set serveroutput on set autoprint on variable p_pret number BEGIN select avg(pret) into :p_pret from rand_comenzi where id_produs = 2. / select * from rand_comenzi where pret< :p_pret. DECLARE v_nr_comenzi number(2). BEGIN select count(nr_comanda) into v_nr_comenzi from comenzi where id_angajat=&id_angajat. END. END.put_line ('Angajatul are: '|| v_nr_comenzi||' comenzi').

salariul into v_prenume. DECLARE v_prenume angajati. DBMS_OUTPUT. afișați cât ar fi salariul dacă s-ar mări cu un procent de 30%. 11 .nume%type. Pentru angajații cu salariul 1900 de RON. Afișați prenumele și salariul acestui angajat. BEGIN select prenume. SET SERVEROUTPUT ON variable a_salariul number DEFINE s_nume=Ionescu. END. :a_salariul from angajati where nume='&s_nume'.PUT_LINE ('Prenumele angajatului este: '|| v_prenume). / Rezolvare: block completed Prenumele angajatului este: Miruna a_salariul ---3650 8.SGBD 7. Se dă numele unui angajat: Stoilescu.

put_line('Salariul mediu este: '|| v_sal_mediu).SGBD ACCEPT p_sal PROMPT 'Introduceți salariul:' ACCEPT p_procent PROMPT 'Introduceți procentul:' DECLARE v_sal number:=&p_sal. BEGIN select avg(salariul) into v_sal_mediu from angajati.0) * (1+nvl(v_procent.put_line('Salariul ar fi: ' || to_char(nvl(v_sal. În cazul în care acest produs nu există.salariul%type. v_procent number:=&p_procent. i number(4):=1. BEGIN dbms_output. Modificați denumirea produsului cu id-ul 6 în “Polen 2”. set serveroutput on BEGIN update produse 12 . END. i:=i+1. / Rezolvare: block completed Salariul ar fi:2470 9. set serveroutput on DECLARE v_sal angajati. afișați pe ecran mesajul corespunzător. / 10. END. exit when v_sal<v_sal_mediu or i>7. v_sal_mediu v_sal%type. loop select salariul into v_sal from angajati where id_angajat=i. dbms_output.0)/100))). end loop. Afișați angajații cu id-urile în intervalul 1-7 atât timp cât salariul acestora este mai mic decât media salariilor.put_line('Angajatul cu codul '||i||' are salariul: '||v_sal). dbms_output.

/ 11. numele și prenumele primilor 5 angajați din tabela Angajați (folosiți un cursor explicit).. close c. prenume varchar2(30) ). nume. set serveroutput on CREATE TABLE ANGAJATI_UPD (cod varchar2(7). v_prenume).id_angajat%type.5 loop fetch c into v_id. v_prenume angajati. Să se afișeze primele 3 comenzi care au cele mai multe produse comandate. care să conțină id-ul. Înregistrările vor fi ordonate descrescător în funcție de numărul produselor. cursor c is select id_angajat. / select * from ANGAJATI_UPD 12.nume%type. if SQL%NOTFOUND then dbms_output. BEGIN open c. insert into ANGAJATI_UPD values(v_id. END. Afișați pe ecran rezultatul. v_prenume. v_nume angajati.prenume%type. end loop. 13 . Creați o nouă tabelă: ANGAJAȚI_UPD. END. nume varchar2(30). v_nume. for i in 1. v_nume. end if.SGBD set denumire_produs='Polen2' where id_produs=6. DECLARE v_id angajati.put_line('Nu exista produsul cu acest cod'). prenume from angajati.

cantitate) total from produse p. / 13.SGBD set serveroutput on DECLARE cursor c_comenzi is select c.numar||' produse'). count(r. loop fetch c_comenzi into rec_comenzi. v_val number(5).put_line ('Numărul de produse pentru fiecare comandă este:'). p. p. Să se afişeze produsele a căror cantitate totală comandată este mai mare decât o valoare introdusă de la tastatură. END. sum(r.denumire_produs.nr_comanda. 14 .nr_comanda||' are: '||rec_comenzi. end loop. close c_comenzi. rec_comenzi c_comenzi%rowtype.id_produs.id_produs) desc.id_produs =r. if not c_comenzi%ISOPEN then open c_comenzi. rand_comenzi r where p.nr_comanda group by c. dbms_output.id_produs) numar from comenzi c.put_line ('Comanda '|| rec_comenzi. end if.nr_comanda order by count(r.id_produs group by p.cantitate)>p_val order by total desc. BEGIN dbms_output. exit when c_comenzi%NOTFOUND or c_comenzi %ROWCOUNT>3. set serveroutput on DECLARE cursor c_prod (p_val number) is select p. rand_comenzi r where c.nr_comanda=r.denumire_produs having sum(r.id_produs.

Să se afişeze angajatul cu codul 13. END. end loop.total||' unitati'). v_prenume varchar2(20). s-au vandut ' ||rec_prod. set serveroutput on DECLARE v_nume varchar2(20). dbms_output. close c_prod.put_line('Produsele a căror cantitate vândută este mai mare decât '|| v_val). '|| rec_prod.put_line('Din produsul '||rec_prod. exit when c_prod%notfound. / 14.id_produs||'.denumire_produs||'. 15 . if not c_prod%ISOPEN then open c_prod (v_val). BEGIN v_val:=&v_val. loop fetch c_prod into rec_prod. dbms_output.SGBD rec_prod c_prod%rowtype. end if. Să se trateze eroarea apărută în cazul în care nu există nici un angajat cu acest cod.

set serveroutput on DECLARE sal angajati. v_prenume from angajati where id_angajat=&id_angajat. when no_data_found then dbms_output.salariul%type. nu există. BEGIN select salariul into sal from angajati where prenume='Miruna'. mesaj_eroare varchar2(255) ). / 15.'). EXCEPTION when too_many_rows then dbms_output. Să se trateze două exceptii. prenume INTO v_nume. / 16.put_line('Angajatul cu id-ul specificat. dbms_output.put_line('Miruna are salariul de: '||sal||' RON'). EXCEPTION when no_data_found then dbms_output. Ștergeți toate înregistrările din tabela: PRODUSE2. END. după care creați o nouă tabelă: ERORI care să conțină valorile SQLCODE şi SQLERRM. cod_eroare number(10). END.SGBD BEGIN select nume. create table ERORI (utilizator varchar2(40).put_line('Nu există angajatul specificat').put_line(v_nume ||' '|| v_prenume). DECLARE 16 . Să se afişeze salariul angajatului cu prenumele Miruna. dbms_output.put_line('Există mai mulți salariați cu numele Miruna').

put_line ('Nu există produsul cu id-ul specificat de dumneavoastră'). mesaj). '). mesaj varchar2(255).put_line('Produsul nu poate fi şters. dbms_output. '). EXCEPTION when del_exception then dbms_output. END. 17 . Procesul de actualizare nu se poate realiza. END. Tratați câte o excepție dacă: -nu există id-ul specificat. / 17. -apare o altă eroare.put_line ('A apărut o eroare. cod. insert into ERORI values(user. cod:=SQLCODE. BEGIN update produse set denumire_produs='Miere nouă' where id_produs=&id_produs. Folosind o procedură. if SQL%NOTFOUND then raise invalid_prod. / 18.SGBD cod number. Să se modifice denumirea unui produs cu id-ul introdus de la tastatură. să se modifice salariul angajatului cu id-ul 6 ( salariul trebuie să devină cu 50% mai mare). end if. BEGIN delete from produse2. EXCEPTION when invalid_prod then dbms_output. DECLARE invalid_prod EXCEPTION. pragma exception_init (del_exception. when OTHERS then dbms_output. mesaj:=SQLERRM.'). del_exception exception. -2292).put_line('Există comenzi în derulare.

18 . dbms_output.SGBD create or replace procedure modifica_salariul_procent (p_id_angajat IN angajati. END. BEGIN select salariul into v_salariul from angajati where id_angajat=p_id_angajat. dbms_output. select salariul into v_salariul from angajati where id_angajat=p_id_angajat.put_line('Noul salariu al angajatului este: '|| v_salariul).id_angajat%type. / EXECUTE modifica_salariul_procent(6. update angajati set salariul=salariul*(1+procent/100) where id_angajat=p_id_angajat. procent IN number) is v_salariul angajati. 50) Rollback.put_line('Angajatul are salariul de '|| v_salariul).salariul%type.

SGBD 19. END. BEGIN select max(salariul) into v_sal_max from angajati where id_functie= :new. Realizați un trigger care să nu permită depășirea unei limite maxime a salariului unui angajat. if :new. create or replace trigger restrictie_salariul before insert or update on angajati for each row DECLARE v_sal_max number. end if. create or replace procedure salariul_mediu (p_salariul_mediu OUT number) is BEGIN select avg (salariul) into p_salariul_mediu from angajati. 19 .salariul>v_sal_max then raise_application_error (-20202. END.id_functie. / variable v_salariul_mediu number execute salariul_mediu(:v_salariul_mediu) print v_salariul_mediu 20. 'Nu se poate depăsi salariul maxim'). / Pentru verificare: update angajati set salariul =10000 where id_angajat=7. Calculați salariul mediu al angajaților și returnați-l printr-un parametru de tip OUT.

Creați un trigger care să asigure unicitatea codului unui produs folosind valorile generate de o secvență.SGBD 21. END. create or replace trigger generare_codprodus before inserto n produse for each row BEGIN select produse_secv. / 20 . crate SEQUENCE produse_secv start with 1 increment by 1 maxvalue 15 nocycle.id_produs from dual.nextval into :new.