create or replace procedure update_bonus
is
cursor emp_cursor is
select e.ename, e.sal, d.loc, s.grade
from emp e, dept d, salgrade s
where e.deptno = d.deptno and
e.sal between s.losal and s.hisal
for update of e.bonus;
emp_record emp_cursor%rowtype;
v_bonus emp.bonus%type;
begin
open emp_cursor;
loop
fetch emp_cursor into emp_record;
exit when emp_cursor%notfound;
if emp_record.loc = 'NEW YORK' and emp_record.grade = 2 then
v_bonus := 9000;
elsif emp_record.loc = 'DALLAS' and emp_record.grade = 1 then
v_bonus := 8000;
elsif emp_record.loc = 'CHICAGO' and emp_record.grade = 2 then
v_bonus := 7000;
else
v_bonus := 5000;
end if;
update emp
set bonus = v_bonus
where current of emp_cursor;
end loop;
commit;
close emp_cursor;
end;
/