【问题标题】:Is there any auto commit happens after executing stored procedures in oracle?在 oracle 中执行存储过程后是否发生任何自动提交?
【发布时间】:2016-03-14 23:19:40
【问题描述】:

我在 oracle DB 中有 3 个表。我正在编写一个程序来根据某些条件删除所有 3 个表中的某些行。

我在过程中一一使用了所有三个删除语句。在执行上述存储过程时,执行时是否发生了自动提交?

否则,我是否需要在最后手动编码提交?

【问题讨论】:

  • 在 PL/SQL 函数或过程中没有自动提交。
  • 我正在使用 oracle 命令行。在那,我正在执行上述过程。执行完之后,我是否需要手动输入commit命令,因为我在存储过程中使用了delete语句。

标签: oracle oracle-sqldeveloper


【解决方案1】:

数据库级别没有自动提交,但您使用的 API 可能具有自动提交功能。 From Tom Kyte.

也就是说,我想补充一下:

除非您正在执行自主事务,否则您应该远离直接在过程中提交:From Tom Kyte

摘录:

我希望 PLSQL 不支持提交/回滚。我坚信 事务控制必须在最高调用者级别完成。那 是您可以采用这 N 个存储过程并绑定它们的唯一方法 一起交易。

此外,还应该注意的是,对于 DDL(根据您的问题,这听起来不像您在程序中执行任何 DDL,但只是将其列为潜在的陷阱),Oracle 在之前添加了一个隐式提交在 DDL 之后。

【讨论】:

    【解决方案2】:

    没有autocommit,但是可以在存储过程中设置commit命令。

    示例 #1:no commit

    create procedure my_proc as
    begin
      insert into t1(col1) values(1);
    end;
    

    当你执行你需要调用的过程时commit

    begin
      my_proc;
      commit;
    end;
    

    示例 #2:commit

    create procedure my_proc as
    begin
      insert into t1(col1) values(1);
      commit;
    end;
    

    当你执行程序时,你不需要调用commit,因为程序会这样做

    begin
      my_proc;
    end;
    

    【讨论】:

      【解决方案3】:

      在存储过程的范围内没有自动提交。但是,如果您使用的是 SQL Plus 或 SQL Developer,则根据设置自动提交是可能的。

      您应该将提交和回滚作为存储过程代码的一部分来处理。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-19
        • 2014-12-04
        • 1970-01-01
        相关资源
        最近更新 更多