我是Oracle的新用户,但对SQL Server有深入的了解。在SQL Server中使用临时表时,我们总是检查该表是否存在,如果存在,则在创建新表之前将其删除。这将允许SQL脚本反复执行而不会出错。
IF OBJECT_ID(N'tempdb..#CnsmrHstRwNm', N'U') IS NOT NULL
DROP TABLE #CnsmrHstRwNm;
CREATE TABLE #CnsmrHstRwNm;
我似乎不能在Oracle中做同样的事情。我研究了几个想法,包括一个说这是个坏主意的人,但没有一个奏效。下面是我尝试过的一个场景。有人有什么想法吗?
我引用了Oracle: If Table Exists,看起来这可以工作,但是我不知道在删除表之后如何创建它。
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE ' || 'MY_TEMP_TABLE';
EXCEPTION
WHEN OTHERS THEN NULL;
CREATE GLOBAL TEMPORARY TABLE MY_TEMP_TABLE (a varchar2(1), b varchar2(1));
END;
有人能帮忙吗?
2条答案
按热度按时间rjzwgtxy1#
我想附议一下,在Oracle中,我们不会在PL/SQL中删除/创建表。这是一个坏主意。创建一次表,然后根据需要多次使用它。删除(或截断)它的内容,插入/更新行,但不要一次又一次地创建它。
不管怎样,这是怎么回事;我包含了 * 消息 *,以便您可以了解正在发生的事情。
起初,表不存在:
运行脚本:
对,表现在已经存在了,您可以使用它,然后再次运行脚本:
pqwbnv8z2#
如果不使用
GLOBAL TEMPORARY TABLE
,而是使用PRIVATE TEMPORARY TABLE
,那么它会在事务完成时自动删除:然后,当您执行
COMMIT
时,该表将自动删除(您可以在下一个事务中重新创建它,而不必删除并重新创建它)。但是,如果您确实需要一个永久表,那么可以使用
EXECUTE IMMEDIATE
删除并创建它,如果表不存在,则捕获(并忽略)异常: