continuare proiect sgbd

Post on 16-Feb-2016

292 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

Continuare Proiect Sgbd

TRANSCRIPT

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,marean89@yahoo.com,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

top related