SET SERVEROUTPUT ON;
--Șterge toate produsele din categoria 'hardware3' care nu au fost niciodată comandate
--(nu apar în rand_comenzi) și afișează câte rânduri s-ar șterge,
--fără a modifica baza de date permanent.
--SQL%ROWCOUNT Câte rânduri au fost afectate de ultima comandă SQL DML executată
DECLARE
begin
delete from produse p where categorie='hardware3' and not exists
(select 1 from rand_comenzi r where p.id_produs=r.id_produs);
dbms_output.put_line('randuri sterse: '||sql%rowcount);
rollback;
dbms_output.put_line(sql%rowcount||' randuri afectate');
end;
--cursor IMPLICIT
--• Sa se stearga din tabela comenzi toate comenzile
--plasate intr-o modalitate introdusa prin
--intermediul unei variabile de substitutie.
--Afisati numarul de comenzi care au fost sterse
--folosind o variabila de mediu.
--accept creeaza o vb de substitutie
--prompt afiseaza text pe ecran
accept g_mod prompt 'Introduceti modalitatea de plasare';
declare
nr_sterse varchar2(100);
begin
delete from comenzi where modalitate='&g_mod';
nr_sterse:=to_char(sql%rowcount)|| ' comenzi sterse';
dbms_output.put_line(nr_sterse);
rollback;
end;
--cursor EXPLICIT
--Să se afișeze lista cu numele și salariul angajaților din departamentul 60:
declare
cursor ang_cursor is select id_angajat, nume, salariul from angajati
where id_departament=60;
ang_rec ang_cursor%rowtype;
begin
dbms_output.put_line('Lista cu salariile angajatilor din dep 60');
open ang_cursor;
loop
fetch ang_cursor into ang_rec;
exit when ang_cursor%notfound;
dbms_output.put_line('Salariatul '||ang_rec.nume||' are salariul:'||ang_rec.salariul);
end loop;
close ang_cursor;
end;
--cu for-loop(nu deschidem cursor, nu inchidem,nu fetch, nu declaram ang _rec)
declare
cursor ang_cursor is select id_angajat,nume,salariul from angajati
where id_departament=60;
begin
dbms_output.put_line('Lista cu salariile angajatilor din dep 60');
for ang_rec in ang_cursor
loop
dbms_output.put_line('Salariatul '||ang_rec.nume||' are salariul:'||ang_rec.salariul);
end loop;
end;
--Să se afişeze suma aferentă salariilor din fiecare departament!!
DECLARE
BEGIN
dbms_output.put_line('Total salarii pe fiecare departament:');
FOR dep_rec IN
(select d. id_departament dep, sum([Link]) sal
from angajati a, departamente d
where a.id_departament=d.id_departament
group by d.id_departament)
LOOP
dbms_output.put_line('Departamentul '||dep_rec.dep||' are de platit
salarii in valoare de: '||dep_rec.sal||' RON');
END LOOP;
END;
--EXERCITII
--Sa se stearga din tabela comenzi toate comenzile plasate intr-o modalitate
--introdusa prin intermediul unei variabile de substitutie. Afisati numarul
--de comenzi care au fost sterse folosind o variabila de mediu.
accept g_mod prompt 'Introduceti modalitatea de plasare';
declare
nr_sterse varchar2(30);
begin
delete from comenzi where modalitate='&g_mod';
nr_sterse:=to_char(sql%rowcount)||' comenzi sterse';
dbms_output.put_line(nr_sterse);
rollback;
nr_sterse:=to_char(sql%rowcount)||' afectate';
dbms_output.put_line(nr_sterse);
end;
--• Să se afişeze primele 3 comenzi care au cele mai multe produse
--comandate. În acest caz înregistrările vor fi ordonate descrescător în
--funcţie de numărul produselor comandate.
declare
begin
dbms_output.put_line('Top 3 comenzi cu cele mai multe produse comandate: ');
for com_rec in (select *from (select rc.id_comanda, sum([Link]) as total_produse
from rand_comenzi rc
group by rc.id_comanda
order by total_produse desc) where rownum<=3)
loop
DBMS_OUTPUT.PUT_LINE('Comanda ' || com_rec.id_comanda || ' are ' ||
com_rec.total_produse || ' produse comandate.');
end loop;
end;
--Utilizați un bloc PL/SQL pentru a afișa pentru fiecare departament (id,
--denumire) valoarea totală a salariilor platite angajaților.
declare
begin
dbms_output.put_line('Valoarea totala a salariilor platita de fiecare depart:');
for dep_rec in (select d.id_departament dep, sum([Link]) sal from angajati a,
departamente d
where a.id_departament=d.id_departament
group by d.id_departament)
loop
dbms_output.put_line('dep '||dep_rec.dep||' are de platit '||dep_rec.sal);
end loop;
end;
/
--Realizați un bloc PL/SQL prin care sa se afișeze pentru fiecare angajat (
--id, nume) detalii cu privire la comenzile intermediate de către acesta
--(id_comandă, data, modalitate)
declare
begin
for ang_rec in( select [Link] num,a.id_angajat id,c.id_comanda com, [Link] dt,[Link]
mod
from angajati a join comenzi c on a.id_angajat=c.id_angajat)
loop
dbms_output.put_line('Angajatul'|| ang_rec.num||'cu id ul '||ang_rec.id||' a intermediat
comanda' || ang_rec.dt);
end loop;
end;