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). Atribuiţi acestei variabile numele oraşului în care se află departamentul având 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 angajaţii al căror 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 numărul angajaţilor săi

este mai mare ca 30, cuprins între 10 departamentului va fi cerut utilizatorului.

şi 30 sau mai mic decât 10. Codul

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) Stocaţi într-o variabilă de substituţie p_cod_dep valoarea unui cod de departament. Definiţi şi o variabilă p_com care reţine un număr din intervalul [0, 100]. Pentru angajaţii din departamentul respectiv care nu au comision, să se atribuie valoarea lui p_com câmpului commission_pct. Afişaţi numărul de linii afectate de această actualizare. Dacă acest număr 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 câmp (vechime de tip

VARCHAR2(200)). Să se creeze un bloc PL/SQL care va reactualiza acest câmp, introducând un pentru fiecare an de vechime al unui angajat al cărui cod este specificat de către 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 calculaţi 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 având codul 200 din tabelul EMP. Să se reţină într-o variabilă de tip RECORD codul, numele, salariul şi departamentul acestui angajat (clauza RETURNING) . Să se afişeze î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;