【问题标题】:PL SQL Auto Commit on executionPL SQL 执行时自动提交
【发布时间】:2013-08-05 05:46:52
【问题描述】:

我对 PL/SQL 编程非常陌生。我尝试在代码中使用一些 DML 语句(插入)编写一个 pl/sql 过程。在 pl/sql 代码中执行插入操作后,我没有进行任何显式提交。但是在执行 pl/sql 过程后事务被提交。

这是默认行为吗?

我该如何控制?

【问题讨论】:

  • 高度依赖于您使用的客户端。那是哪个? Sql*Plus? Oracle DB 本身没有 DML 的自动提交
  • 我正在使用 sql* plus 和 perl dbi 来运行 pl/sql 过程

标签: plsql plsqldeveloper


【解决方案1】:

在 PL/SQL Developer 客户端中,您可以通过 Preferences 控制 SQL Window 事务的自动提交。

【讨论】:

    【解决方案2】:

    DML 语句 (INSERT/DELETE/UPDATE/MERGE) 在 PL/SQL 中不执行自动提交。 DDL 语句确实提交(ALTER/CREATE 等),即使发生故障也会发生这种情况。如果您正在运行 EXECUTE IMMEDIATE(如运行 DDL 的动态语句),这也将提交您的事务。自从2000

    像 SQL*Plus 这样的客户端接口有一个可以关闭/打开的自动提交功能,请在客户端文档中查找。像

    SET AUTOCOMMIT OFF
    

    可以看到这个变量的当前状态

    SHOW AUTCOMMIT 
    

    这会告诉你它是否开/关。

    通过this 了解更多自动提交的变体

    【讨论】:

    • 因此,如果我们在 pl/sql 过程中有任何 DML 语句,并且如果我没有在 pl/sql 过程中明确提交它,则不会提交事务。并且在程序执行完成后,所有的事务都会被回滚。对吗?
    • 可以,但要确保 SQL*plus 的自动提交功能已关闭。还有一些自动提交的 DBMS 包。因此,例如,如果您在运行过程后使用 DBMS_STATS 收集统计信息,则该包中存在隐式提交。还有谷歌保存点、autonomous_transaction 并查看stackoverflow.com/questions/11966020/… 以了解有关此主题的更多信息。但最佳实践是在成功时通过调用函数为 proc 发出提交,并在异常时回滚。
    • @mohan - 程序执行完成后事务不会回滚。事务将保持打开状态,直到您 A)提交,B)回滚,或 C)断开连接,此时未提交的事务将被回滚。此外,如果您有一个打开的事务并执行 DDL 语句(CREATE TABLE、DROP INDEX 等),则将提交打开的事务。分享和享受。
    • +1 ^ 错过了'并且所有的事务将在程序执行完成后回滚'
    猜你喜欢
    • 2021-07-17
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多