Sunteți pe pagina 1din 5

*--------------------------------* Plan materie BD: 11 noiembrie + variabile 18 noiembrie + variabile 25 noiembrie + cursoare si functii (proceduri?

) De venit neaparat ex pt lucrare 2? decembrie + cursoare si functi (proceduri?) 9 decembrie + proceduri + triggeri De venit neaparat ex pt lucrare 16 decembrie proceduri + triggeri 7 ianuarie + 1,2(ex cu pachete) + triggeri + recapitulare 14 ianuarie + 1,2(ex cu pachete) *--------------------------------*

Laborator 3 BD 1) Afiseaza pe ecran "invat pl/sql" set serveroutput on; begin dbms_output.put_line('invat pl/sql'); end;

2) Creare variabile de diferite tipuri si afisare pe ecran * (steluta indica linia de unde incepe codul cerintei) set serveroutput on; declare a number(8,2):=5; (numar) * b varchar2(10):='text'; (caracter) nume employees.last_name%type; (de tipul employees.last_name) begin dbms_output.put_line('invat pl/sql ' ||a); end;

3) Introducere informatii din linii in variabile si afisare pe ecran * set serveroutput on; declare a number(8,2):=5; b varchar2(10):='text'; nume employees.last_name%type; linie employees%rowtype; sal employees.salary%type; begin select employee_id, salary into a,sal * from employees

where employee_id=145; dbms_output.put_line(a||' '||sal); end; 4) S se creeze un bloc anonim n care se declar o variabil v_oras de tipul coloanei city (locations.city%TYPE). Atribuii acestei variabile numele oraului n care se afl departamentul avnd codul 30. set serveroutput on; declare v_oras locations.city%TYPE; v_dep number(3):=30; (se poate inlocui numarul "30" cu "&<nume variabila>" si la executare se scrie la tastatura numarul dorit) begin select city into v_oras from locations join departments using (location_id) where department_id=v_dep; dbms_output.put_line('Departamentul '||v_dep||' se afla in '||v_oras); end; 5) S se creeze un bloc anonim n care s se afle media salariilor pentru angajaii al cror departament este 50. Se vor folosi variabilele v_media_sal de tipul coloanei salary i v_dept (de tip NUMBER). set serveroutput on; declare v_media_sal employees.salary%TYPE; v_dep number(3):=&nr; begin select avg(salary) into v_media_sal from employees where department_id=v_dep; dbms_output.put_line('Media salariilor in '||v_dep||' este '||v_media_sal); end; Pentru a preveni utilizatorul sa introduca un numar invalid se foloseste instructiunea "if" in bloc pentru a-l informa ca nu exista codul departamentului respectiv set serveroutput on; declare v_media_sal employees.salary%TYPE; v_dep number(3):=&nr; verifica number(2); begin select count(department_id) into verifica from departments where department_id=v_dep; if verifica=0 then dbms_output.put_line('Departamentul nu exista'); else select avg(salary) into v_media_sal

from employees where department_id=v_dep; dbms_output.put_line('Media salariilor in '||v_dep||' este '||v_media_sal); end if; end; 6) S se specifice dac un departament este mare, mediu sau mic dup cum numrul angajailor si este mai mare ca 30, cuprins ntre 10 i 30 sau mai mic dect 10. Codul departamentului va fi cerut utilizatorului. set serveroutput on; declare v_descriere char(10); v_dep number(3):=&nr; verifica number(2); begin select count(department_id) into verifica from departments where department_id=v_dep; if verifica=0 then dbms_output.put_line('Departamentul nu exista'); else select count(employee_id) into verifica from employees where department_id=v_dep; case when verifica < 10 then v_descriere:='Dep mic'; when verifica between 10 and 30 then v_descriere:='Dep mediu'; else v_descriere:='Dep mare'; end case; dbms_output.put_line('Departamentul '||v_dep||' este '||v_descriere); end if; end; 7) Stocai ntr-o variabil de substituie p_cod_dep valoarea unui cod de departament. Definii i o variabil p_com care reine un numr din intervalul [0, 100]. Pentru angajaii din departamentul respectiv care nu au comision, s se atribuie valoarea lui p_com cmpului commission_pct. Afiai numrul de linii afectate de aceast actualizare. Dac acest numr este 0, s se scrie Nicio linie actualizata . set serveroutput on; declare v_dep number(3):=&p_cod_dep; com number(2):=&comision; begin update employees set commission_pct=com/100 where commission_pct is null and department_id=v_dep; if sql%found then

dbms_output.put_line(sql%rowcount||' Linii modificate'); end if; end; rollback;

8) n structura tabelului emp se va introduce un nou cmp (vechime de tip VARCHAR2(200)). S se creeze un bloc PL/SQL care va reactualiza acest cmp, introducnd un # pentru fiecare an de vechime al unui angajat al crui cod este specificat de ctre utilizator. set serveroutput on; declare v_ang emp.employee_id%type:=&cod; vechime number(2); text varchar2(200):=''; begin select floor((sysdate-hire_date)/365) into vechime from emp where employee_id=v_ang; while vechime>0 loop text:=text||'#'; vechime:=vechime-1; end loop; update emp set vechime=text where employee_id = v_ang; end; 9) Folosind o instructiune LOOP calculai n!

set serveroutput on; declare nr number(2):=&p_nr; factorial number(12):=1; begin loop factorial:=factorial*nr; nr:=nr-1; exit when nr=1; end loop; dbms_output.put_line(factorial); end;

10) Afiseaza employee_id, salary si department_id codul angajatului introdus. set serveroutput on; declare cod_ang number(3):=&p_cod; linie employees%rowtype; begin select * into linie from employees

where employee_id=cod_ang; dbms_output.put_line(linie.employee_id||' '||linie.salary||' '||linie.department_id); end; 11) S se tearg angajatul avnd codul 200 din tabelul EMP. S se rein ntr-o variabil de tip RECORD codul, numele, salariul i departamentul acestui angajat (clauza RETURNING) . S se afieze nregistrarea respectiv. Rollback. set serveroutput on; declare type angajat is record (cod employees.employee_id%type, nume varchar(20), sal employees .salary%type, dep number(3) ); v_ang angajat; begin delete from emp where employee_id=200 returning employee_id, last_name, salary, department_id into v_ang; dbms_output.put_line(v_ang.cod||' '||v_ang.nume||' '||v_ang.sal||' '||v_ang.dep); end; rollback;

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