create or replace procedure update_emp
is
cursor emp_cursor is
select e.empno, d.loc, s.grade
from emp e, dept d, salgrade s
where d.deptno = e.deptno
and s.losal <= e.sal
and s.hisal >= e.sal
for update;
emp_rec emp_cursor%rowtype;
v_bonus emp.bonus%type;
begin
open emp_cursor;
loop
fetch emp_cursor into emp_rec;
exit when emp_cursor%notfound;
if emp_rec.loc = 'NEW YORK' and emp_rec.grade = 2 then
v_bonus := 9000;
elsif emp_rec.loc = 'DALLAS' and emp_rec.grade = 1 then
v_bonus := 8000;
elsif emp_rec.loc = 'CHICAGO' and emp_rec.grade = 2 then
v_bonus := 7000;
else
v_bonus := 5000;
end if;
update emp
set bonus = v_bonus
where empno = emp_rec.empno;
end loop;
dbms_output.put_line(sql%rowcount || 'rows updated');
commit;
close emp_cursor;
end;
/
execute update_emp;