【问题标题】:exception in stored procedure存储过程中的异常
【发布时间】:2012-02-22 13:51:52
【问题描述】:

我有以下程序:

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 中没有异常一样。我想知道前两个成功执行的插入会发生什么?他们会被保留吗?

【问题讨论】:

    标签: oracle stored-procedures plsql


    【解决方案1】:

    here for Oracle's explanation。您可以跳到 Oracle 如何隐式回滚部分开始。

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

    更多:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-21
        • 2012-01-31
        • 2014-07-18
        • 1970-01-01
        相关资源
        最近更新 更多