Переменная rate_rec
находится в области видимости в цикле, а не снаружи.Вы должны поместить все свои put_line
в цикл.
rate_rec.new_sal
- старая зарплата.Новый будет обновлен в таблице, а не в записи с предыдущим окладом.
Я предлагаю вам выполнить обновления, а затем еще раз выбрать и проверить, что оно было изменено.Вы также можете использовать предложение returning
в обновлениях, чтобы получить новую зарплату.
Вот возможное решение.Я не проверил тщательно запрос.Вероятно, в конце процедуры должен быть commit
.
set serveroutput on
create or replace procedure update_data(p_id number) is
prj_count integer;
avg_hours integer;
old_salary number;
new_salary number;
begin
select count(a.projectid), round(avg(a.hours),0), e.salary
into prj_count, avg_hours, old_salary
from assignment a join employee e on a.empid=e.empid
where e.empid=p_id
group by e.salary;
new_salary := old_salary;
if avg_hours >= 10 then
if prj_count<4 then
update employee set salary=salary+salary*0.05
where empid=p_id
returning salary into new_salary;
else
update employee set salary=salary+salary*0.1
where empid=p_id
returning salary into new_salary;
end if;
end if;
dbms_output.put_line('Old salary: ' || old_salary);
dbms_output.put_line('New salary: ' || new_salary);
end update_data;
/