【问题标题】:Create a global temporary table in Oracle SQL在 Oracle SQL 中创建全局临时表
【发布时间】:2024-10-21 03:00:02
【问题描述】:

我是 SQL 新手。我想在 Oracle SQL 中创建一个(全局或非全局)临时表,其中将包含SELECT * FROM tbl_NAME WHERE... 形式的简单数据选择,并且在我的会话结束后将被删除(就像 MSFT SQL 临时表一样形成##tbl_NAME)。

我在网上发现一种方法是:

CREATE GLOBAL TEMPORARY TABLE tmp_table
SELECT * FROM tbl_NAME WHERE conditions.
ON COMMIT PRESERVE ROWS;

虽然我收到错误 ORA-00904: invalid identifier

我还发现另一种选择是

CREATE PRIVATE TEMPORARY TABLE tmp_table AS 
SELECT * FROM tbl_NAME WHERE conditions;

给出错误 ORA-00905: missing keyword

请注意,我已经知道一种可行的替代方法是:

DROP TABLE    tmp_table;
CREATE TABLE    tmp_table AS 
SELECT      * FROM tbl_NAME; 
DROP TABLE    tmp_table;

【问题讨论】:

  • 仅供参考:Tom Kyte 总是 warns 关于 MS SQL 人员在 Oracle 中使用临时表而不是子选择。

标签: sql oracle temp-tables


【解决方案1】:

你想用 rows 做什么是第一位的;接下来是SELECT

SQL> create global temporary table gtt_dept
  2  on commit preserve rows                       --> first
  3  as
  4  select * from dept;                         --> next

Table created.

SQL>

【讨论】:

  • 您向我展示的示例确实创建了表,尽管在我的会话结束后它没有被删除,这是我需要使用临时表的主要原因。表。
  • @Whitebeard13 你用的是ON COMMIT PRESERVE ROWS还是on commit delete rows
  • 保留。我犯了一个错误,我最初在我的问题中写了 delete,这就是为什么 Littlefoot 的答案是 delete
  • 没错。我刚刚修复了语法。
  • @Whitebeard13 Oracle 中没有这样的东西,即使有,标识符也可以包含#,但必须以字母开头。此外,在运行时出现和消失的模式对象会对依赖跟踪和 PL/SL 编译器造成严重破坏,因此无论如何它都不会那么有用。
【解决方案2】:

您展示的以下格式适用于 TERADATA

创建全局临时表 tmp_table SELECT * FROM tbl_NAME WHERE 条件。 提交保留行;

在 Oracle 中是这样工作的

创建全局临时表gtt_dept 提交时保留行
作为 从部门中选择*;

【讨论】: