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

Gig*_*aPr 86 sql oracle

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

就像是

Declare table @table (int id)
Run Code Online (Sandbox Code Playgroud)

在SQL服务器中

而不是用select语句填充它

可能吗?

谢谢

ham*_*mcn 127

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

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

CREATE GLOBAL TEMPORARY TABLE today_sales(order_id NUMBER)
ON COMMIT PRESERVE ROWS;
Run Code Online (Sandbox Code Playgroud)

Oracle 18c添加了私有临时表,它们是单会话内存中对象.有关详细信息,请参阅文档.可以动态创建和删除私有临时表.

CREATE PRIVATE TEMPORARY TABLE ora$ptt_today_sales AS
SELECT * FROM orders WHERE order_date = SYSDATE;
Run Code Online (Sandbox Code Playgroud)

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

  • 没有downvote,但我永远不会为全局临时表推荐CREATE TABLE AS SELECT - 经验不足的开发人员可能会错误地认为他们每次都必须以这种方式填充GTT.当然,这是从另一个表复制定义的便捷方式,但这个例子可能会让一些人感到困惑. (39认同)
  • 你可以添加"where 1 = 0"; (3认同)
  • CREATE TABLE AS SELECT的有效用例:从带有LOB列的远程表中进行选择,因为您不能直接从中进行SELECT。我正在编写一个从远程数据库复制记录的过程,这就是我的解决方案:将记录放入GTT中,然后从中复制到“真实”表中。 (2认同)

Mat*_*son 73

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

  • `删除',而不是'DROP`. (30认同)
  • 我不完全明白.你说过你只创建一次,而不是每次创建.但是,您还说每个会话都会删除临时表.这是不是意味着你需要在每次会话中创建临时表? (14认同)
  • 你不会在每个会话中创建临时表,但是一次.该表可在整个系统中使用.可以从您创建的任何会话访问该表,包括并行会话.但是当您从一个会话中插入数据时,该数据在整个系统的其他并行会话中不可见.一个会话的数据仅是该会话的属性.因此,数据是会话特定的,不是系统可见的.因此,当您关闭一个会话时,该会话的数据将从表中删除. (10认同)

小智 33

CREATE GLOBAL TEMPORARY TABLE Table_name
    (startdate DATE,
     enddate DATE,
     class CHAR(20))
  ON COMMIT DELETE ROWS;
Run Code Online (Sandbox Code Playgroud)

  • 请注意,在会话结束时将始终删除行; "ON COMMIT DELETE ROWS"意味着如果你在会话期间逐步提交,它们将被更快地丢弃. (9认同)