存储过程中的异常

时间:2012-02-22 13:51:53

标签: oracle stored-procedures plsql

我有以下程序:

procedure mayFailProc() as
begin
    insert into t1 (id, val) values (1, '123');
    insert into t1 (id, val) values (2, '123');
    insert into t1 (id, val) values (3, '123'); //fails, i.e. due to pk uniqueness error
end;

mayFailProc中抛出的这个异常是正常的,它由调用者处理。因此,事务不会回滚并继续执行,就像mayFailProc中没有异常一样。我想知道前两个成功执行插入会发生什么?他们会被保留还是不被保留?

2 个答案:

答案 0 :(得分:3)

here for Oracle's explanation。您可以跳转到Oracle Oracle Implicit Rollbacks部分开始。

  

在执行INSERT,UPDATE或DELETE语句之前,Oracle会标记   隐式保存点(对您不可用)。如果声明失败,   Oracle回滚到保存点。通常,只是失败的SQL   语句被回滚,而不是整个事务。如果声明   引发一个未处理的异常,主机环境决定了什么   回滚。

更多:

  

您应该显式提交或回滚每个事务。是否   您在PL / SQL程序中或从a发出提交或回滚   客户端程序取决于应用程序逻辑。如果你不提交   或显式回滚事务,即客户端环境   确定其最终状态。

     

例如,在SQL * Plus环境中,如果您的PL / SQL块有   不包括COMMIT或ROLLBACK语句,你的最终状态   事务取决于运行块后您执行的操作。如果你   执行数据定义,数据控制或COMMIT语句,或者如果您执行   发出EXIT,DISCONNECT或QUIT命令,Oracle提交   交易。如果执行ROLLBACK语句或中止SQL * Plus   会话,Oracle回滚了该事务。

答案 1 :(得分:0)

刚刚做了一个快速测试......当第三个插入导致“唯一约束......违反”错误时,我的测试中的行未被保留