3

我需要一个创建表的脚本,或者如果它已经存在则删除它,并在重新创建表时。经过一番研究,我发现CREATE OR REPLACE TABLE在 pl/sql 中不存在。所以我想出了这个脚本:

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);

有什么合适的方法来实现这个功能吗?

4

2 回答 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;
/
于 2013-05-19T12:53:29.307 回答
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(...)';

分享和享受。

于 2013-05-19T12:55:04.483 回答