我熟悉Sybase / SQL服务器,在那里我可以创建一个temp。像这样的表:
SELECT *
INTO #temp
FROM tab1 ,
tab2
WHERE tab1.key = tab2.fkey
SELECT *
FROM #temp
WHERE field1 = 'value'
#temp仅在此会话期间存在,并且只能由我看到。
我想在Oracle中做类似的事情,但我正在阅读“全局临时表”,这听起来不一样。
我如何在Oracle中执行与在Sybase中执行相同的操作?
谢谢:)
答案 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时设置它。