如何在Oracle数据库中创建临时表?


90

我想在Oracle数据库中创建一个临时表

就像是

Declare table @table (int id)

在SQL Server中

然后用选择语句填充它

可能吗?

谢谢

Answers:


130

是的,Oracle有临时表。这是描述它们的AskTom文章的链接,是oracle的官方CREATE TABLE文档。

但是,在Oracle中,只有临时表中的数据是临时的。该表是其他会话可见的常规对象。在Oracle中频繁创建和删除临时表是一种不好的做法。

CREATE GLOBAL TEMPORARY TABLE today_sales(order_id NUMBER)
ON COMMIT PRESERVE ROWS;

Oracle 18c添加了私有临时表,这些临时表是单会话内存中的对象。有关更多详细信息,请参见文档。私有临时表可以动态创建和删除。

CREATE PRIVATE TEMPORARY TABLE ora$ptt_today_sales AS
SELECT * FROM orders WHERE order_date = SYSDATE;

临时表可能有用,但在Oracle中通常被滥用。通常可以通过使用内联视图将多个步骤组合到单个SQL语句中来避免它们。


40
毫无疑问,但我绝不建议为全局临时表创建CREATE TABLE AS SELECT -经验不足的开发人员可能会错误地认为,他们每次都必须以这种方式填充GTT。当然,这是从另一个表复制定义的便捷方法,但是该示例可能会使某些人感到困惑。
杰弗里·肯普

我在这里完全同意Jeffrey Kemp的观点,这只是创建此表的一种方法,我遇到了这个问题,并且意识到,我是否必须将此选择语句放入DDL中。
维杰·库玛

3
您可以只添加“ where 1 = 0”;
Palcente '17年

@Palcente仍然暗示您需要一个具有相同结构的“真实表”才能创建一个临时表,事实并非如此(请参见此答案。除此之外,该答案还指出了不仅仅是在全球临时表,但一个也可以使用“普通”的临时表。到SQL Server的区别,因为马修指出的,是另一个重要的一点应该确保不错失(或怀疑其对“第二个电话”的错误关于已经存在的对象;)
Izzy

2
有效的用例CREATE TABLE AS SELECT:从带有LOB列的远程表中选择,因为您不能直接SELECT从它们中进行选择。我正在编写一个从远程数据库复制记录的过程,这就是我的解决方案:将记录放入GTT中,然后从中复制到“真实”表中。
rgoliveira

78

只是一个提示。.Oracle中的临时表与SQL Server不同。您创建它一次,并且仅一次创建,而不是每个会话。插入到行中的行仅对您的会话可见,并且在您结束会话(或事务结束,取决于您使用的“ ON COMMIT”子句)时会自动删除(即,TRUNCATE不是DROP)。


15
我不太了解 您说您只创建一次,而不是每个会话一次。但是,您还说过,临时表在每个会话中都会被删除。这不是意味着您需要在每个会话中创建临时表吗?
2014年

31
DELETED,而不是DROPped。
Tripp Kinetics 2014年

10
您不必在每个会话中创建临时表,而只能创建一次。该表在整个系统中均可用。可从您创建的任何会话(包括并行会话)访问该表。但是当您从一个会话中插入数据时,该数据在系统中的其他并行会话中不可见。一个会话的数据仅是该会话的属性。因此,数据是特定于会话的,而不是系统可见的。因此,当您关闭一个会话时,该会话的数据将从表中删除。
SubhasisM

33
CREATE GLOBAL TEMPORARY TABLE Table_name
    (startdate DATE,
     enddate DATE,
     class CHAR(20))
  ON COMMIT DELETE ROWS;

10
请注意,这些行将始终在会话结束时删除;ON COMMIT DELETE ROWS表示如果您在会话中进行增量提交,则将尽快将其丢弃。

1
zygimantus,是的,您可以在会话期间手动删除。在会话期间,临时表的行为与普通表完全相同。从用户的角度来看,临时表和实际表之间的唯一区别是,一旦会话结束,所有行都将被删除,并且其他任何会话都无法读取该会话使用的表的内容。每个会话都有一个表实例;两个会话可以同时使用同一个临时表,并且具有两组不同的行,而不会发生任何冲突。
汉斯·德拉贡

-2

创建表table_temp_list_objects AS

从sys.all_objects中选择o.owner,o.object_name o在哪里o.object_type ='TABLE';


请格式化您的答案。如果您编写有关代码的内容,那将是很好的。
旅馆
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.