【问题标题】:Howto use Rollback/Commit in Oracle SQL如何在 Oracle SQL 中使用回滚/提交
【发布时间】:2011-04-23 22:32:06
【问题描述】:

我第一次尝试在 Oracle SQL 中使用事务功能,但似乎找不到很好的解释。我了解开始一个新会话将开始一个新事务。我也明白提交/回滚是用来结束它的。我想要做的是执行两个语句,如果我其中一个失败,撤消他们可能所做的任何更改并继续执行。如何检查这种情况并相应地发出提交或回滚?

【问题讨论】:

    标签: sql oracle transactions


    【解决方案1】:

    使用 PL/SQL 块并编写如下内容:

    begin
    
      statement_zero;
    
      savepoint my_savepoint;
    
      begin
        -- if either of these fail, then exception section will be executed
        statement_one;
        statement_two;
      exception
         when others then
           rollback to my_savepoint;
      end;
    
      statement_three;
    
      commit;
    
    end;
    

    另见http://www.adp-gmbh.ch/ora/concepts/transaction.html

    【讨论】:

    • 啊,好的,谢谢,再研究一下块,我发现了另一个与我正在尝试做的事情有关的问题。我正在尝试向表中添加一列,设置所有当前条目的默认值并设置触发器以根据需要更新此值。块只允许 SELECT、INSERT、UPDATE、DELETE。将其包装在交易中的任何想法?
    • DDL 语句(CREATE、ALTER、DROP 等)在执行前后隐式 COMMIT。因此,您所指的操作不能在单个事务中执行,也不能回滚。
    • 顺便说一句,您可以使用动态 SQL 在 PL/SQL 块中执行 DDL 语句,例如EXECUTE IMMEDIATE 'ALTER TABLE foo ADD x NUMBER'。但这并没有改变 DDL 语句在更新数据字典之前和之后执行 COMMIT 的事实。
    • 感谢各位的帮助,他们花了几个小时在谷歌上搜索,试图把它拼凑起来。非常感谢
    【解决方案2】:

    ObiWanKenobi 提供了一个很好的示例,可以在 Oracle 概念指南的 Chapter 4 找到 Oracle 事务的详细说明(我提供的链接适用于 10.2,您可以在 Oracle 网站上找到适合您版本的文档以及)。我建议您阅读本章以了解 Oracle 如何处理事务管理,整个文档对于了解 Oracle DB 的工作原理非常有用。

    【讨论】:

      猜你喜欢
      • 2014-11-15
      • 1970-01-01
      • 2022-01-19
      • 2020-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-20
      相关资源
      最近更新 更多