【发布时间】:2011-02-09 22:05:50
【问题描述】:
我想在 Oracle 数据库中创建一个临时表
类似
Declare table @table (int id)
在 SQL 服务器中
然后用 select 语句填充它
有可能吗?
谢谢
【问题讨论】:
标签: sql oracle temp-tables
我想在 Oracle 数据库中创建一个临时表
类似
Declare table @table (int id)
在 SQL 服务器中
然后用 select 语句填充它
有可能吗?
谢谢
【问题讨论】:
标签: sql oracle temp-tables
是的,Oracle 有临时表。这是一个链接,指向描述它们的 AskTom 文章,here 是官方的 oracle CREATE TABLE 文档。
但是,在Oracle 中,只有临时表中的数据 是临时的。该表是其他会话可见的常规对象。在 Oracle 中频繁创建和删除临时表是一种不好的做法。
CREATE GLOBAL TEMPORARY TABLE today_sales(order_id NUMBER)
ON COMMIT PRESERVE ROWS;
Oracle 18c 添加了私有临时表,它们是单会话内存对象。有关详细信息,请参阅the documentation。私有临时表可以动态创建和删除。
CREATE PRIVATE TEMPORARY TABLE ora$ptt_today_sales AS
SELECT * FROM orders WHERE order_date = SYSDATE;
临时表可能很有用,但它们在 Oracle 中经常被滥用。通常可以通过使用内联视图将多个步骤组合到一个 SQL 语句中来避免它们。
【讨论】:
CREATE TABLE AS SELECT 的有效用例:从具有 LOB 列的远程表中选择,因为您不能直接从它们中选择 SELECT。我正在编写一个从远程数据库复制记录的过程,这是我的解决方案:将记录放入 GTT,然后从该记录复制到“真实”表。
提示.. Oracle 中的临时表与 SQL Server 不同。您创建它一次且仅一次,而不是每个会话。您插入其中的行仅对您的会话可见,并在您结束会话(或事务结束,具体取决于您使用哪个“ON COMMIT”子句)时自动删除(即TRUNCATE,而不是DROP)使用)。
【讨论】:
DELETED,不是DROPped。
CREATE GLOBAL TEMPORARY TABLE Table_name
(startdate DATE,
enddate DATE,
class CHAR(20))
ON COMMIT DELETE ROWS;
【讨论】:
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';
【讨论】: