Oracle存储过程中异常处理应注意的问题

2014-11-24 18:41:52 · 作者: · 浏览: 1

如果主存储过程和主函数又由子过程或子函数构成,在子函数或子程序中能否包含异常处理


要依据以下原则:


第一、如果主程序和子程序要作为一个事务来处理,则在子程序中不能触发异常,异常要到主调程序中取处理,如果在子程序中进行异常处理,如果子程序出现异常,进行异常处理后,还会继续执行主调程序中调用的出现异常的子程序的下面的代码,这样又开始了新的事务,这样破坏了事务的一致性,从而破坏了数据的一致性


主调程序如下:


procedure sp_procedure


is
vs_pay_year_month varchar2(6);
vs_sql varchar2(10000);


begin
sp_procedure1;


sp_procedure2;


update emp set empname='张三' where empid='00001'


exception
WHEN OTHERS THEN
--发生异常,把禁止的触发器设为有效
vs_sql:='alter table sal_t_mainper enable all triggers';
execute immediate vs_sql;
end;


子程序:


procedure sp_procedure1


is


begin


update department set dept_name='人事部' where deptid='0001'


delete from department where deptid='0002'


exception


WHEN OTHERS THEN
--发生异常,把禁止的触发器设为有效
raise_application_error(-20001, '删除发生错误!');


end;


所以,在子程序中不允许处理异常,这样就会破坏数据的一致性


第二、如果主程序和子程序不作为一个事务来处理,则在子程序中可以触发异常,但这种情况很少。