如何在Oracle中创建临时表作为另一个表的副本?

the*_*ude 2 sql database oracle oracle-sqldeveloper

我已经尝试过了:

CREATE GLOBAL TEMPORARY TABLE tempTable AS
SELECT * FROM realTable;
Run Code Online (Sandbox Code Playgroud)

但是,tempTable只有realTable的结构,而不是元素本身.

APC*_*APC 12

"但是,tempTable只有realTable的结构,而不是元素本身."

使全局临时表临时的原因是数据是暂时的.首先,数据仅在插入它的会话中可见; 任何其他会话都会看到一个空表.其次,数据可以持久存在于事务或会话中,具体取决于ON COMMIT子句; 默认为ON COMMIT DELETE ROWS. 了解更多.

现在的问题是,Oracle中的DDL语句发出两个提交,一个在有问题的语句之前,一个在有关语句之后.所以DDL语句是一个完整的离散事务.因此......

CREATE GLOBAL TEMPORARY TABLE tempTable AS
SELECT * FROM realTable;
Run Code Online (Sandbox Code Playgroud)

...是一个事务,因为它没有指定ON COMMIT子句,所以它将应用默认值DELETE ROWS.所以空表是预期的行为.

解决方案很简单:使用会话级保留指定ON COMMIT语句:

SQL> select count(*) from t23;

  COUNT(*)
----------
        11

SQL> create global temporary table gtt23
  2  as select * from t23
  3  /

Table created.

SQL> select count(*) from gtt23;

  COUNT(*)
----------
         0

SQL> drop table gtt23;

Table dropped.

SQL> create global temporary table gtt23
  2  on commit preserve rows
  3  as select * from t23
  4  /

Table created.

SQL> select count(*) from gtt23;

  COUNT(*)
----------
        11

SQL> 
Run Code Online (Sandbox Code Playgroud)

通常,我认为使用SELECT*FROM创建GLOBAL TEMPORARY TABLE的策略表明对构造的误解.Oracle中的GTT是永久性数据结构 ; 只有记录是临时的.它们不是像T-SQL中的临时表那样的一次性对象.如果这是你想要的那种东西,你可能应该使用PL/SQL集合.了解更多.