Sybase Developer问:如何在Oracle中创建临时表?

时间:2008-10-21 13:11:43

标签: sql sql-server oracle sybase temp-tables

我熟悉Sybase / SQL服务器,在那里我可以创建一个temp。像这样的表:

SELECT * 
INTO   #temp
FROM   tab1 , 
       tab2 
WHERE  tab1.key = tab2.fkey

SELECT * 
FROM   #temp 
WHERE  field1 = 'value' 

#temp仅在此会话期间存在,并且只能由我看到。

我想在Oracle中做类似的事情,但我正在阅读“全局临时表”,这听起来不一样。

我如何在Oracle中执行与在Sybase中执行相同的操作?

谢谢:)

6 个答案:

答案 0 :(得分:4)

全局临时表不一样,定义在会话结束后保留​​,所有会话也可以看到表(但不是数据)。

如果您正在编写存储过程,那么您是否查看了游标?它有点复杂,但是使用临时数据集非常有效且干净。

答案 1 :(得分:4)

您的第一种方法应该是以单个查询的方式执行此操作:

SELECT * 
FROM   
(
SELECT * 
FROM   tab1 , 
       tab2 
WHERE  tab1.key = tab2.fkey
)
WHERE  field1 = 'value';

对于非常复杂的情况或temp#非常大的情况,请尝试使用子查询因子子句,可选择使用materialize提示:

with #temp as
(
SELECT /*+ materialize */ 
       * 
FROM   tab1 , 
       tab2 
WHERE  tab1.key = tab2.fkey
)
SELECT * 
FROM   temp#
WHERE  field1 = 'value';

如果没用,请转到全局临时表方法。

答案 2 :(得分:2)

Oracle不提供此工具的直接模拟。全局临时表类似,但必须提前创建,并且由于锁定问题而难以更改。

这种性质的大多数需求可以通过游标或其中一种不同的pl / sql集合类型(嵌套表,varrays,关联数组)来满足,但这些都不能像使用它们一样使用。也就是说,你无法从中进行选择。

答案 3 :(得分:1)

我相信global temporary表是一样的。它们将允许您私下访问会话结束时死亡的临时表:

  

全局临时表中的数据是私有的,因此会话插入的数据只能由该会话访问。可以为整个会话保留全局临时表中的特定于会话的行,或仅保留当前事务。 ON COMMIT DELETE ROWS子句指示应在事务结束时删除数据。

在多次阅读问题后,我认为这是主要区别,也许您的问题是临时表在会话之间持续存在。所以确切的等价物是不可能的,正如你在Oracle中想象的那样:

CREATE GLOBAL TEMPORARY TABLE my_temp_table ON COMMIT DELETE ROWS select * from other table;

该表将一直存在,直到它通过会话被删除,尽管其中的数据没有。相反,您需要提前创建临时表。

答案 4 :(得分:1)

临时表模型在Oracle中有所不同,并以“CREATE GLOBAL TEMPORARY TABLE ..”语句为中心。临时表定义始终是全局的,但数据始终是会话专用的,并且数据是否在提交中持续存在取决于是否指定了“在提交保留行上”或“在提交删除行上”的限定。

我有一些Perl脚本和一个博客帖子,用于探讨my blog上的特定行为或Oracle临时表。

答案 5 :(得分:0)

是的,卡森说得对。全局临时表仅对创建它们的会话可见,并在第一次提交或回滚时或在会话结束时消失。你可以在创建gtt时设置它。