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

Sql 如何在Oracle数据库中创建临时表?,sql,oracle,temp-tables,Sql,Oracle,Temp Tables,我想在Oracle数据库中创建一个临时表 差不多 Declare table @table (int id) 在SQL server中 然后用select语句填充它 可能吗 谢谢是的,Oracle有临时表。下面是一篇描述它们的文章的链接,这是oracle的官方创建表文档 但是,在Oracle中,只有临时表中的数据是临时的。该表是其他会话可见的常规对象。在Oracle中频繁创建和删除临时表是一种不好的做法 CREATE GLOBAL TEMPORARY TABLE today_sales(ord

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

差不多

Declare table @table (int id)
在SQL server中

然后用select语句填充它

可能吗


谢谢

是的,Oracle有临时表。下面是一篇描述它们的文章的链接,这是oracle的官方创建表文档

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

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

Oracle18c添加了私有临时表,它们是内存对象中的单个会话。有关更多详细信息,请参阅。可以动态创建和删除专用临时表

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


临时表可能很有用,但在Oracle中经常被滥用。通常可以通过使用内联视图将多个步骤组合到一个SQL语句中来避免这些问题。

只是一个提示。。Oracle中的临时表与SQL Server不同。您只创建一次,而不是每次会话。插入其中的行仅对会话可见,并且在您结束会话(或事务结束,取决于您使用的“on COMMIT”子句)时自动删除(即
TRUNCATE
,而不是
DROP
),但我决不会建议将CREATETABLE作为全局临时表的SELECT—经验较少的开发人员可能会错误地认为他们每次都必须以这种方式填充GTT。当然,这是一种从另一个表复制定义的方便方法,但是这个例子可能会让一些人感到困惑。我完全同意Jeffrey Kemp的观点,这只是创建这个表的一种方法,我遇到了这个,并且意识到,我是否必须将这个select语句放在DDL中。你可以添加“where 1=0”@Palcente仍然暗示,为了创建一个临时表,您需要一个具有相同结构的“真实表”,但事实并非如此(另请参见。除此之外,这个答案没有指出,不仅存在全局临时表,还可以使用“普通表”临时表。与SQL Server的区别是另一个重要的方面,我们应该确保不要错过(或者怀疑关于已经存在的对象的“第二次调用”中的错误;)
CREATE TABLE AS SELECT
的有效用例:从具有LOB列的远程表中选择,因为您不能直接从它们中选择。我正在编写一个从远程数据库复制记录的过程,这就是我的解决方案:将记录带到GTT中,然后从GTT复制到“real”表。我不完全理解。你说你只创建了一次,而且不是每次会话都创建。但是你还说临时表在每次会话中都会被删除。这不是意味着你需要在每次会话中创建临时表吗?
deleted
,而不是
DROP
ped。你不是每次会话都创建临时表,而是一次。该表在整个系统中都可用。该表可以从您创建的任何会话(包括并行会话)中访问。但是,当您从一个会话中插入数据时,该数据在整个系统的其他并行会话中不可见。一个会话的数据仅是该会话的属性。因此,该数据是特定于会话的,而不是visible systemwise。因此,当您关闭一个会话时,该会话的数据将从表中删除。请注意,这些行将始终在会话结束时删除;
ON COMMIT DELETE rows
意味着,如果您在会话期间增量提交,它们将被丢弃。zygimantus,是的,您可以在会话期间手动删除。在在会话中,临时表的行为与普通表完全相同。从用户的角度来看,临时表和实际表之间的唯一区别在于,一旦会话结束,所有行都将被删除,其他会话无法读取会话所使用的表的内容。每个会话都有一个表实例;两个会话可以同时使用同一个临时表,并且有两组不同的行,没有任何冲突。请格式化您的答案。如果您能写一些关于代码的内容,那就太好了。
CREATE GLOBAL TEMPORARY TABLE Table_name
    (startdate DATE,
     enddate DATE,
     class CHAR(20))
  ON COMMIT DELETE ROWS;
CREATE TABLE table_temp_list_objects AS
SELECT o.owner, o.object_name FROM sys.all_objects o WHERE o.object_type ='TABLE';