BAZE DE DATE
2022
Gr.4
4. . Se da tabelul:
CREATE TABLE salarii2(
Marca_angajat INT NOT NULL,
an NUMBER(4) NOT NULL,
luna number(2) NOT NULL,
orelucrate NUMBER(3),
venitbaza NUMBER(16,2),
sporuri NUMBER(16,2),
impozit NUMBER(16,2),
retineri NUMBER(16,2),
CONSTRAINT pk_salarii PRIMARY KEY (marca_angajat,an,luna),
CONSTRAINT ck_salarii_an CHECK (an between 2001 and 2012),
CONSTRAINT pk_salarii_luna CHECK (luna BETWEEN 1 and 12)
);
Scrieti o functie care determina venitul net al angajatului cu numarul de inregistrare
“marca_angajat” (parametru de intrare. VenitNet= Venitbaza*(sporuri/100) – impozit -retineri).
Raspuns :
create or replace function venit_net(p_marca_angajat in number) as
v_venit_net number;
v_venit_baza number;
v_sporuri number;
v_impozit number;
v_retineri number;
begin
begin
select venitbaza, sporuri, impozit, retineri
into v_venit_baza, v_sporuri, v_impozit, v_retineri
from salarii2
where Marca_angajat = p_marca_angajat;
exception
when no_data_found then
v_venit_baza := '';
v_sporuri := '';
v_impozit := '';
v_retineri := '';
end;
v_venit_net := v_venit_baza*(v_sporuri/100) - v_impozit - v_retineri;
return v_venit_net;
end;
5. Daţi un exemplu bloc de execuţie PL/SQL care defineşte un cursor ce modifica salariul_pe_ora cu
10 procente in plus, daca este inferior valorii de 24 lei/ora.
Raspuns :
declare
v_salariul_pe_ora number;
v_marca_angajat number;
cursor c_salariu is
select Marca_angajat, salariul_pe_ora from salarii2;
begin
open c_salariu;
loop
fetch c_salariu into v_marca_angajat, v_salariul_pe_ora;
exit when c_salariu;%notfound;
if v_salariul_pe_ora < 24 then
update salarii2
set salariul_pe_ora = salariul_pe_ora + salariul_pe_ora*0.1
where marca_angalat = v_marca_angajat;
end if;
end loop;
end;
6. Definiti un trigger care avertizeaza daca la inserare in tabela de la punctul 4 numarul de ore
lucrate depaseste 180 pe luna.
Raspuns :