continuare proiect sgbd

16
SGBD – NEGRILA CATALIN A: Interacţiunea cu serverul Oracle prin intermediul comenzilor SQL (LDD şi LMD) 1.Sa se selecteze denumirea produsuluicu id-ul ‚4’ din tabela Produse DECLARE v_nume produse.denp%type BEGIN select denp into v_nume from produse where id_produs=’4’; END; / 2. Angajatii ‘11’ , ‘12’ si ‘13’au primit cate un leu in plus la salariu in urma grevei. Sa se modifice si in tabela BEGIN update angajati set salariu=salariu+1

Upload: nitu-mihai

Post on 16-Feb-2016

290 views

Category:

Documents


0 download

DESCRIPTION

Continuare Proiect Sgbd

TRANSCRIPT

Page 1: Continuare Proiect Sgbd

SGBD – NEGRILA CATALIN

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

1.Sa se selecteze denumirea produsuluicu id-ul ‚4’ din tabela Produse

DECLAREv_nume produse.denp%typeBEGINselect denp into v_nume from produse where id_produs=’4’;END;/

2. Angajatii ‘11’ , ‘12’ si ‘13’au primit cate un leu in plus la salariu in urma grevei. Sa se modifice si in tabela

BEGINupdate angajatiset salariu=salariu+1where id_ang IN (‘11’, ‘12’, ’13’);

Page 2: Continuare Proiect Sgbd

END;/

3. Să se șteargă angajatul cu id-ul cel mai mare folosind un bloc PL/SQL.SET SERVEROUTPUT ON DECLARE v_id angajati.id_ang%TYPE;BEGIN select max(id_ang) into v_id from angajati; delete from angajati where id_ang=v_id;

END;/

Page 3: Continuare Proiect Sgbd

B: Structuri alternative şi repetitive

Sa se mareasca pretul produsului cu id-ul ‚5’ astfel (Folosind structura alternative IF)

- Daca pretul este mai mic decat 40 cu 200%- Daca pretul este intre 40 si 80 cu 100%- Daca pretul este mai mare de 80 cu 50%

DECLAREv_pret produs.pret%type;BEGINSELECT pret into v_pret from produse where id_produs=5;dbms_output.put_line('pretul produsului initial este: '||v_pret);IF v_pret < 40 THEN

v_pret:=4* v_pret;ELSIF v_pret between 40 and 80 THEN

v_pret:=2 * v_pret;ELSE

v_pret:=1.5* v_pret;END IF;dbms_output.put_line(pretul produsului final este: '||v_pret);END;

Să se afișeze folosind un bloc toți angajații folosind o structură repetitivă de tip for

SET SERVEROUTPUT ON DECLARE v_min angajati.id_ang%type;v_max angajati.id_ang%type;v_nume angajati.nume%type;BEGIN Select min(id_ang),max(id_ang) into v_min,v_max from angajati; for i IN v_min..v_max

Page 4: Continuare Proiect Sgbd

loop select nume into v_nume from angajati where id_ang=i; dbms_output.put_line(v_nume); end loop; END;/

Să se afișeze toate sucursalele folosind o strctură repetitivă while

SET SERVEROUTPUT ON DECLARE i sucursala.cod_s%type;v_min sucursala.cod_s%type;v_max sucursala.cod_s%type;v_nume sucursala.nume%type;BEGIN select min(cod_s),max(cod_s) into v_min,v_max from sucursala; i:=v_min; while(i<=v_max) loop select nume into v_nume from sucursala where cod_s=i; i:=i+1; dbms_output.put_line(v_nume); end loop; END;/

Page 5: Continuare Proiect Sgbd

Să se afișeze numele și emailul pentru toti angajatii folosind o structură repetitivă do while.

SET SERVEROUTPUT ON DECLARE i angajati.id_ang%type;v_min angajati.id_ang%type;v_max angajati.id_ang%type;v_nume angajati.nume%type;v_email angajati.email%type;BEGIN select min(id_ang),max(id_ang) into v_min,v_max from angajati; i:=v_max; loop select nume,email into v_nume,v_email from angajati where id_ang=i; i:=i-1; dbms_output.put_line(v_nume||' '||v_email); exit when (i<v_min); end loop; END;/

Page 6: Continuare Proiect Sgbd

Să se crească cu 20 lei prețul produsului care are momentan prețul 420. Dacă nu se modifică nimic să se trateze excepția.

SET SERVEROUTPUT ON DECLARE excep exception;begin update produse set pret=pret+10 where pret=420; if(sql%rowcount=0) then raise excep; end if; exception when excep then dbms_output.put_line('totul a ramas nemodificat'); END;/

Page 7: Continuare Proiect Sgbd

Să se afișeze id-ul sucursalei unde s-a angajat clientul cu id-ul 1. În cazul în care se întroc mai multe valori sau nu se găsesc date să se trateze excepții.

SET SERVEROUTPUT ON DECLARE v_id sucursala.cod_s%type;

beginselect cod_s into v_id from angajati where id_ang=1;exception when TOO_MANY_ROWS then dbms_output.put_line('Angajatul lucreaza in mai multe sucursale'); when NO_DATA_FOUND then dbms_output.put_line('Angajatul nu exista'); when others then dbms_output.put_line('Au aparut erori');END;/

Să se afișeze id_ul și numele angajatului, și numele sucursalei la care lucrează folsoind un cursor

SET SERVEROUTPUT ON DECLARE cursor c is select nume ,id_ang,cod_s from angajati;v_nume sucursala.nume%type;beginfor x in c loop select nume into v_nume from sucursala where cod_s=x.cod_s; dbms_output.put_line(x.nume||' are id-ul '||x.id_ang||' si lucreaza la sucursala '||v_nume); end loop; END;/

Page 8: Continuare Proiect Sgbd

Să se afișeze folosind un cursor numele tuturor abonatilor

SET SERVEROUTPUT ON DECLARE cursor c is select nume from abonati;v_nume sucursala.nume%type;beginopen c;loop fetch c into v_nume; dbms_output.put_line(v_nume); exit when c%notfound; end loop; close c; END;/

Page 9: Continuare Proiect Sgbd

Vom folosi procedura de aflare a salariului mediu al unui angajat.

create or replace procedure sal_mediu (p_sal_mediu OUT number)ISbegin select avg(salariu) into p_sal_mediu from angajati;end;/

Să se creeze un pachet cu o funcție și o procedură ce inserază un angajat nou si ii afiseaza numele si salariul.

CREATE OR REPLACE PROCEDURE cauta_angajat(p_id_ang IN angajati.id_ang%type,p_nume OUT angajati.nume%type,p_salariu OUT angajati.salariu%type)ISBEGINSelect nume, salariu into p_nume, p_salariu from angajati where id_ang=p_id_ang;DBMS_OUTPUT.PUT_LINE(' Angajatul '||p_nume||' are salariul de: '||p_salariu);END;/

Page 10: Continuare Proiect Sgbd

Să se creeze un pachet cu o funcție și o procedură ce calculează vechimea unui angajat și inserază un angajat nou.

SET SERVEROUTPUT ON create or replace package pachet_angajatias procedure adauga_angajati (id_a in angajati.id_ang%type,nume in angajati.nume%type,prenume in angajati.prenume%type ,id_s in angajati.cod_s%Type,email in angajati.email%type,dat in angajati.data_ang%type,sal in angajati.salariu%type); function vechine(cod angajati.id_ang%type)return number;end;/

Page 11: Continuare Proiect Sgbd

SET SERVEROUTPUT ON create or replace package body pachet_angajatias procedure adauga_angajati (id_a in angajati.id_ang%type,nume in angajati.nume%type,prenume in angajati.prenume%type ,id_s in angajati.cod_s%Type,email in angajati.email%type,dat in angajati.data_ang%type,sal in angajati.salariu%type); as begin insert into angajati values (id_a,nume,prenume,id_s,email,dat,sal); exception when dup_val_on_index then dbms_output.put_line('exista angajatul'); end; function vechime(cod angajati.id_ang%type)return number; as vechime number; begin select (sysdate-data_ang)/365 into vechime from angajati where id_ang=cod; return vechime; exception when no_data_found then return 0; end; end;/

/*SET SERVEROUTPUT ON BEGIN pachet_angajati.adauga_angajati(444,'Vanghelie','Marean',11,[email protected],SYSDATE,550); end;/ select * from angajati where id_ang=444; */

Page 12: Continuare Proiect Sgbd

Să se creeze un declanșator care să se declanșeze când are loc un update al pretului unui produs

CREATE OR REPLACE TRIGGER majorareBEFORE INSERT or UPDATE on produseFOR EACH ROW begin dbms_output.put_line('Pret vechi: '||:old.pret||' iar pretul nou este '||:new.pret);

end;/update produseset pret=pret+10;

Să se creeze un declanșator pentru tabela sucursala care să indice tipul de operație care s-a executat asupra tabelei

CREATE OR REPLACE TRIGGER modificare_sucursalaBEFORE INSERT or UPDATE or DELETE on sucursala begin case when inserting then dbms_output.put_line('S-a inserat'); when updating then dbms_output.put_line('S-a updatat'); else dbms_output.put_line('S-a sters');

Page 13: Continuare Proiect Sgbd

end case;end;/ update sucursala set nume = 'Fuioru' where cod_s=2;

Să se creeze un raport și un formular pentru tabela ABONATI

Page 14: Continuare Proiect Sgbd