【问题标题】:Does DDL for creating Oracle temporary tables commit transaction?用于创建 Oracle 临时表的 DDL 是否提交事务?
【发布时间】:2015-02-04 08:01:22
【问题描述】:

如何在没有 DDL 提交事务的情况下在 Oracle db (CREATE GLOBAL TEMPORARY TABLE) 中创建临时表?

我想要和 MySQL 一样的行为。来自here

CREATE TABLE 不会自动提交当前活动的 如果您使用 TEMPORARY 关键字,则进行交易。

【问题讨论】:

  • 是的,Oracle 中的 每个 DDL 都会隐式提交。请注意,在 Oracle 中,您通常只创建一个(全局)临时一次。您不会“即时”创建它们。
  • 您不需要动态创建对象,表(包括临时表)只能在受控条件下创建——通常是在安装或升级应用程序时。在 Oracle 中真正需要临时表并不常见,它们的使用方式与其他数据库不同。如果您描述了您使用它的目的,我们可能会建议一种合适的方法。
  • 永远不要混合 DML 和 DDL - 这是 Oracle 的经验法则。不建议将一个数据库的模式应用于其他数据库。您通常应该在 Oracle 中使用游标或某些复杂类型,而在 MySQL/MSSQL 中使用临时表。在 Oracle 中,当您需要临时表时,您的设计可能有问题。

标签: database oracle oracle11g


【解决方案1】:

是的,DDL 提交您的事务。

除了 Franek 的回答,我想指出您不需要动态创建 全局临时表,因为此类表中的所有数据对于插入它的会话都是私有的.

因此,如果您创建一次全局临时表,您的会话可以安全地使用此表,而不必担心干扰其他会话,并且 ddl-commit 问题变得无关紧要。

【讨论】:

  • 我会小心“你不应该动态创建全局临时表”的声明,因为有时需要重新创建临时表,例如当它用于 ETL 时,可以在运行时重新定义此类 ETL。在我看来,这种方式并不少见......
  • 我以为我很小心。我写的是应该,而不是必须
【解决方案2】:

您可以使用 PRAGMA AUTONOMOUS_TRANSACTION 在新事务中创建 GLOBAL TEMPORARY TABLE 以避免在当前事务中自动提交,如下所示:

    create or replace
      PROCEDURE create_gtt IS
      PRAGMA AUTONOMOUS_TRANSACTION;
      BEGIN
      execute immediate 'CREATE GLOBAL TEMPORARY TABLE gtt_table ( '||
     ' column1  NUMBER, ' ||
     ' ) ON COMMIT DELETE ROWS';
    END;

在这种情况下,调用 create_gtt 不会提交您的插入:

    CREATE TABLE test_table (test_value VARCHAR2(25));

    begin
        insert into test_table(test_value) values ('TEST');
        create_gtt;
    end;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-14
    • 2015-12-12
    • 2017-11-18
    • 2011-02-22
    • 2019-12-09
    • 2017-02-02
    • 2016-04-02
    相关资源
    最近更新 更多