Пара предложений.
Использовать SQL% ROWCOUNT:
BEGIN
UPDATE NIGHT_SHIFT
Set SOME_DUMB_FIELD = evening_shift_employees.employee;
v_rows_processed := SQL%ROWCOUNT;
dbms_output.put_line('There were '||v_rows_processed||' rows updated');
END;
Не использовать, когда другие (почему вы хотите потерять трассировку стека). Просто используйте исключения, вы будете полагаться на вызывающего, чтобы проверить содержимое ошибки
begin
insert into t values ( 1 );
exception when others then
log_error;
raise;
end;
Реализация log_error выглядит так:
create or replace procedure log_error
as
pragma autonomous_transaction;
l_whence varchar2(1024);
l_msg varchar2(1020) default sqlerrm;
l_code number default sqlcode;
begin
l_whence := whence;
insert into error_table
( timestamp, whence, msg, code )
values
( sysdate, whence, l_msg, l_code );
commit;
exception
when others then
rollback;
raise;
end;
Не используйте какой-либо pl / sql. На первый взгляд, обновление выглядит полностью выполнимым без курсора. Возможно обновляемое встроенное представление:
update (
select e.sal as emp_sal, e.comm as emp_comm,
ns.sal as ns_sal, ns.sal/2 as ns_comm
from employees e, night_shift ns
where e.deptno = ns.deptno
)
set emp_sal = ns_sal, emp_comm = ns_comm