首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

Oracle异常处理

2014-01-28 
Oracle异常处理问题,有以下过程,我想每次触发异常时都回滚事务,应该怎么改呢? 不会在每个异常处理后面都加

Oracle异常处理问题,有以下过程,我想每次触发异常时都回滚事务,应该怎么改呢?
不会在每个异常处理后面都加上
if j_StartWork = 1 then
  rollback work;
end if; 

-------------------------------------------------------
Create or Replace procedure testproc(
in_SheetID  in char,
in_Checker  in char,
in_OrderNo  in int,
out_Result  out int) is 

STATUS_IS_VALID  exception;
SHEET_NOT_FOUND  exception;
UNKNOW_SHEET_STATUS  exception;
QTY_ERROR exception;
begin
j_Result := 0;
j_StartWork := 0;

j_startwork := 1;
j_SheetType := 2503;


j_BreakPoint := 2502115; 
commit work; 
out_Result := j_Result;
return;

exception
when SHEET_NOT_FOUND then
sMsg := '单据没有找到';
raise_application_error(-20000,'SQLCODE='||SQLCODE||',Breakpoint='||j_Breakpoint||',MSG='||sMsg);
when STATUS_IS_VALID then
sMsg := '单据状态错误';
raise_application_error(-20000,'SQLCODE='||SQLCODE||',Breakpoint='||j_Breakpoint||',MSG='||sMsg);
when QTY_ERROR then
sMsg := '验收数据验证错误';
raise_application_error(-20000,'SQLCODE='||SQLCODE||',Breakpoint='||j_Breakpoint||',MSG='||sMsg);
when UNKNOW_SHEET_STATUS then
sMsg := '未定义状态标志';
raise_application_error(-20000,'SQLCODE='||SQLCODE||',Breakpoint='||j_Breakpoint||',MSG='||sMsg);
when others then
if j_StartWork = 1 then
  rollback work;
end if; 
raise_application_error(-20000,'SQLCODE='||SQLCODE||','|| 'Breakpoint='||j_Breakpoint||',MSG='||SQLERRM);
end testproc;

------解决方法--------------------------------------------------------
定义一个共通的EXCEPTION不需要写得那么多了。

你的
if  j_StartWork  =  1  then
  rollback  work;
  end  if; 

本来就只有OTHERS有呀,
------解决方法--------------------------------------------------------
异常终了的时候应该自动回滚了,不需要手动回滚。

        

热点排行