用于创建Oracle临时表的DDL是否提交事务?

时间:2015-02-04 08:01:22

标签: database oracle oracle11g

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

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

  

CREATE TABLE不会自动提交当前活动的   如果使用TEMPORARY关键字,则为事务。

2 个答案:

答案 0 :(得分:6)

是的,DDL提交您的交易。

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

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

答案 1 :(得分:1)

您可以使用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不会提交您的insert:

    CREATE TABLE test_table (test_value VARCHAR2(25));

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