在Oracle PL/SQL中创建或替换表

3

我需要一个能够创建表格或者在已存在的情况下删除并重新创建表格的脚本。经过一些研究,我发现在pl/sql中并不存在CREATE OR REPLACE TABLE的语法。因此,我想出了以下脚本:

DECLARE
   does_not_exist   EXCEPTION;
   PRAGMA EXCEPTION_INIT (does_not_exist, -942);
BEGIN
   EXECUTE IMMEDIATE 'DROP TABLE foobar';
EXCEPTION
   WHEN does_not_exist
   THEN
      NULL;
END;
/ 

CREATE TABLE foobar (c1 INT);

有没有适当的方法来实现这个功能?

根据您的需求,也许使用临时表会很有用。 - Dan Bracuk
不好意思,我需要使用表格而不是临时表。但还是谢谢你的建议。 - kuldarim
我从来没有理解过这个东西。如果表不存在,就删除它 - 没有任何损失。 - haki
2个回答

9

您真的不应该在PL/SQL中这样做,运行时创建表格会显示数据模型存在缺陷。如果您确信非要这样做,请先研究临时表。个人认为最好重新评估是否有必要。

您似乎正在采用EAFP而非LBYL方法,这在此问题的几个答案中有所描述。我认为这是不必要的。表格是一个相当静态的东西,您可以使用系统视图USER_TABLES来确定它是否存在,然后再删除它。

declare

   l_ct number;

begin

   -- Determine if the table exists.
   select count(*) into l_ct
     from user_tables
    where table_name = 'THE_TABLE';

   -- Drop the table if it exists.
   if l_ct = 1 then
      execute immediate 'drop table the_table';
   end if;

   -- Create the new table it either didn-t exist or
   -- has been dropped so any exceptions are exceptional.
   execute immediate 'create table the_table ( ... )';

end;
/

谢谢Ben,我知道在运行时重新创建表格是一种不好的方法,但是我必须完成分配给我的任务。 - kuldarim

5

使用全局临时表似乎是更好的选择。然而,如果您坚持在运行时删除和重新添加表格,您可以查询其中一个_TABLES视图(即USER_TABLES、DBA_TABLES、ALL_TABLES)来确定表格是否存在,如果存在,则删除它,然后创建它:

SELECT COUNT(*)
  INTO nCount
  FROM USER_TABLES
  WHERE TABLE_NAME = 'FOOBAR';

IF nCount <> 0 THEN
  EXECUTE IMMEDIATE 'DROP TABLE FOOBAR';
END IF;

EXECUTE IMMEDIATE 'CREATE TABLE FOOBAR(...)';

分享并享受。

@Ben - 你比我快了一分钟! - Bob Jarvis - Слава Україні

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接