删除Oracle中存在的临时表

vjhs03f7  于 2023-01-16  发布在  Oracle
关注(0)|答案(2)|浏览(236)

我是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;

有人能帮忙吗?

rjzwgtxy

rjzwgtxy1#

我想附议一下,在Oracle中,我们不会在PL/SQL中删除/创建表。这是一个坏主意。创建一次表,然后根据需要多次使用它。删除(或截断)它的内容,插入/更新行,但不要一次又一次地创建它。
不管怎样,这是怎么回事;我包含了 * 消息 *,以便您可以了解正在发生的事情。
起初,表不存在:

SQL> desc test
ERROR:
ORA-04043: object test does not exist

运行脚本:

SQL> set serveroutput on
SQL> begin
  2    begin
  3      dbms_output.put_line('Trying to drop a table');
  4      execute immediate 'drop table test';
  5      dbms_output.put_line('Table dropped');
  6    exception
  7      when others then
  8        dbms_output.put_line('Error when dropping the table: ' || sqlerrm);
  9        null;
 10    end;
 11    dbms_output.put_line('Creating a table');
 12    execute immediate 'create table test (a varchar2(1))';
 13    dbms_output.put_line('Table created');
 14  end;
 15  /
Trying to drop a table
Error when dropping the table: ORA-00942: table or view does not exist
Creating a table
Table created

PL/SQL procedure successfully completed.

SQL> desc test
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 A                                                  VARCHAR2(1)

对,表现在已经存在了,您可以使用它,然后再次运行脚本:

SQL> begin
  2    begin
  3      dbms_output.put_line('Trying to drop a table');
  4      execute immediate 'drop table test';
  5      dbms_output.put_line('Table dropped');
  6    exception
  7      when others then
  8        dbms_output.put_line('Error when dropping the table: ' || sqlerrm);
  9        null;
 10    end;
 11    dbms_output.put_line('Creating a table');
 12    execute immediate 'create table test (a varchar2(1))';
 13    dbms_output.put_line('Table created');
 14  end;
 15  /
Trying to drop a table
Table dropped
Creating a table
Table created

PL/SQL procedure successfully completed.

SQL>
pqwbnv8z

pqwbnv8z2#

如果不使用GLOBAL TEMPORARY TABLE,而是使用PRIVATE TEMPORARY TABLE,那么它会在事务完成时自动删除:

CREATE PRIVATE TEMPORARY TABLE ora$ptt_temp (
  a varchar2(1), b varchar2(1)
);

然后,当您执行COMMIT时,该表将自动删除(您可以在下一个事务中重新创建它,而不必删除并重新创建它)。
但是,如果您确实需要一个永久表,那么可以使用EXECUTE IMMEDIATE删除并创建它,如果表不存在,则捕获(并忽略)异常:

DECLARE
  does_not_exist EXCEPTION;
  PRAGMA EXCEPTION_INIT(does_not_exist, -942);
BEGIN
  BEGIN
    EXECUTE IMMEDIATE 'DROP TABLE MY_TEMP_TABLE';
  EXCEPTION
    WHEN does_not_exist THEN
      NULL;
  END;
  EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE MY_TEMP_TABLE (a varchar2(1), b varchar2(1))';
END;
/

相关问题