处理异常后写回滚

时间:2014-04-17 07:29:57

标签: plsql

我有一个场景,我正在写这样的例外

     when others then
         rollback;
         p_status     := 'ERROR'; -- MODIFIED
         p_status_dtl := sqlcode||' - '||substr(sqlerrm,1,100);
end;

如果我这样写

exception
     when others then
                      p_status     := 'ERROR'; -- MODIFIED
                      p_status_dtl := sqlcode||' - '||substr(sqlerrm,1,100);
             rollback;
end;      

是否会产生影响,如果是,那有什么区别。

1 个答案:

答案 0 :(得分:3)

如果变量赋值不抛出(即p_statusp_status_dtl都是具有足够存储空间的正确数据类型),则示例相同。

如果变量赋值抛出,那么在第二个示例rollback中不执行。

在下面的示例中,仅打印checkpoint 1

declare
  v_foo varchar2(2) := 'AB';
  v_bar number;
begin
  -- raises ORA-01476: divisor is equal to zero
  v_bar := 1/0;
exception
  when others then
    dbms_output.put_line('checkpoint 1');
    -- raises ORA-06502: PL/SQL: numeric or value error: character string buffer too small
    v_foo := 'TOO LONG';
    dbms_output.put_line('checkpoint 2');
end;
/