PROCEDURE PC_ADD_BONUS
IS
cursor c_upd_bonus is
SELECT pc_employee_bonus.salary, pc_employee_bonus.employee_id,
pc_employee_bonus.last_name, pc_employee_bonus.bonus,
pc_employee_bonus.relativ_bonus
FROM pc_employee_bonus
ORDER BY pc_employee_bonus.salary DESC
FOR UPDATE OF pc_employee_bonus.bonus, pc_employee_bonus.relativ_bonus NOWAIT;
type erg is record (
salary pc_employee_bonus.salary%TYPE,
employee_id pc_employee_bonus.employee_id%TYPE,
last_name pc_employee_bonus.last_name%TYPE,
bonus pc_employee_bonus.bonus%TYPE,
relativ_bonus pc_employee_bonus.relativ_bonus%TYPE);
erg_record erg;
old_salary number(30);
pre_old_salary number(30);
BEGIN
open c_upd_bonus;
dbms_output.put_line('Bonus eintragen:');
old_salary := 0;
pre_old_salary := 0;
loop
fetch c_upd_bonus into erg_record;
exit when c_upd_bonus%NOTFOUND;
if old_salary = erg_record.salary then
old_salary := pre_old_salary;
end if;
if erg_record.salary > 5000 then
erg_record.bonus := erg_record.salary * 0.05;
end if;
if erg_record.salary <= 5000 then
erg_record.bonus := erg_record.salary * 0.2;
end if;
update pc_employee_bonus
set bonus = erg_record.bonus
where current of c_upd_bonus;
if erg_record.salary * 1.1 > old_salary then
erg_record.relativ_bonus := erg_record.salary * 0.05;
else
erg_record.relativ_bonus := erg_record.salary * 0.2;
end if;
update pc_employee_bonus
set relativ_bonus = erg_record.relativ_bonus
where current of c_upd_bonus;
dbms_output.put_line(erg_record.last_name||' Salary:'||erg_record.salary||' Bonus:'||erg_record.bonus||' Relativer Bonus:'||erg_record.relativ_bonus);
pre_old_salary := old_salary;
old_salary := erg_record.salary;
end loop;
if (c_upd_bonus%rowcount = 0) then
dbms_output.put_line('Kein Datensatz gefunden!!');
else
dbms_output.put_line(c_upd_bonus%rowcount||' Datensätze upgedated!!');
end if;
close c_upd_bonus;
END; -- Procedure