我想在Oracle数据库中创建临时表比如
Declare table @table (int id)
在SQL服务器中然后用select语句填充它有可能吗?谢谢
yi0zb3m41#
是的,Oracle有临时表。这里有一个AskTom文章的链接,描述了它们,这里是官方的Oracle CREATE TABLE文档。但是,在Oracle中,只有临时表中的 data 是临时的。该表是其他会话可见的常规对象。在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语句中来避免使用临时表。
hwamh0ep2#
提示一下。Oracle中的临时表与SQL Server中的临时表不同。临时表只能创建一次,而不是在每个会话中创建。插入到临时表中的行仅对会话可见,并且在会话结束时(或事务结束时,取决于您使用的“ON COMMIT”子句)自动删除(即TRUNCATE,而不是DROP)。
TRUNCATE
DROP
sq1bmfud3#
CREATE GLOBAL TEMPORARY TABLE Table_name (startdate DATE, enddate DATE, class CHAR(20)) ON COMMIT DELETE ROWS;
jpfvwuh44#
如果您尝试创建类似于SQL Server的内容,其中您选择#TEMP_TABLE_NAME,则无法在Oracle中使用CREATE TABLE实现此操作,除非您具有这样做的安全性,如果您是常规报表编写者,则可能不太可能实现此操作。在Oracle中,如果您尝试将SELECT块的输出存储在内存中以提高查询性能,则需要在CTE的主SELECT中使用Oracle提示/+ MATERIALIZE/。这会将CTE的结果存储在内存中,并且可以在查询的其他部分中访问,而不必冒每次引用CTE时都要重新执行CTE的风险。示例:
WITH CTE AS ( SELECT /*+ MATERIALIZE*/ 'FOO' AS "STUFF" FROM DUAL ) SELECT * FROM CTE
如果您在之后检查执行计划,您将看到该对象将作为“CursorDuration Memory”读入。
6ie5vjzr5#
CREATE TABLE table_temp_list_objects AS SELECT o.owner, o.object_name FROM sys.all_objects o WHERE o.object_type ='TABLE';
5条答案
按热度按时间yi0zb3m41#
是的,Oracle有临时表。这里有一个AskTom文章的链接,描述了它们,这里是官方的Oracle CREATE TABLE文档。
但是,在Oracle中,只有临时表中的 data 是临时的。该表是其他会话可见的常规对象。在Oracle中频繁地创建和删除临时表是不好的做法。
Oracle 18c添加了专用临时表,它们是单会话内存中对象。有关详细信息,请参阅文档。可以动态创建和删除专用临时表。
临时表可能很有用,但在Oracle中经常被滥用。通常可以通过使用内联视图将多个步骤组合到单个SQL语句中来避免使用临时表。
hwamh0ep2#
提示一下。Oracle中的临时表与SQL Server中的临时表不同。临时表只能创建一次,而不是在每个会话中创建。插入到临时表中的行仅对会话可见,并且在会话结束时(或事务结束时,取决于您使用的“ON COMMIT”子句)自动删除(即
TRUNCATE
,而不是DROP
)。sq1bmfud3#
jpfvwuh44#
如果您尝试创建类似于SQL Server的内容,其中您选择#TEMP_TABLE_NAME,则无法在Oracle中使用CREATE TABLE实现此操作,除非您具有这样做的安全性,如果您是常规报表编写者,则可能不太可能实现此操作。
在Oracle中,如果您尝试将SELECT块的输出存储在内存中以提高查询性能,则需要在CTE的主SELECT中使用Oracle提示/+ MATERIALIZE/。这会将CTE的结果存储在内存中,并且可以在查询的其他部分中访问,而不必冒每次引用CTE时都要重新执行CTE的风险。
示例:
如果您在之后检查执行计划,您将看到该对象将作为“CursorDuration Memory”读入。
6ie5vjzr5#