gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 19:54:48 26 4
gpt4 key购买 nike

我已经试过了:

CREATE GLOBAL TEMPORARY TABLE tempTable AS
SELECT * FROM realTable;

但是 tempTable 只有 realTable 的结构,而没有元素本身。

最佳答案

"But then tempTable has only the structure of realTable, but not the elements themselves."

使全局临时表临时的原因是数据是临时的。首先,数据仅在插入它的 session 中可见;任何其他 session 将看到一个空表。其次,根据 ON COMMIT 子句,数据可以为事务或 session 持久化;默认值为 ON COMMIT DELETE ROWS。 Find out more .

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

CREATE GLOBAL TEMPORARY TABLE tempTable AS
SELECT * FROM realTable;

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

解决方案很简单:指定具有 session 级保留的 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>

一般来说,我认为 CREATE GLOBAL TEMPORARY TABLE using SELECT * FROM 的策略表示对构造的误解。 Oracle 中的 GTT 是永久数据结构;只有记录是临时的。它们不像 T-SQL 中的临时表那样是一次性对象。如果那是您想要的那种东西,您可能应该改用 PL/SQL 集合。 Find out more .

关于sql - 如何在 Oracle 中创建一个临时表作为另一个表的副本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27093937/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com