continuare proiect sgbd
DESCRIPTION
Continuare Proiect SgbdTRANSCRIPT
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’);
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;/
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
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;/
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;/
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;/
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;/
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;/
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;/
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;/
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; */
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');
end case;end;/ update sucursala set nume = 'Fuioru' where cod_s=2;
Să se creeze un raport și un formular pentru tabela ABONATI