在 Oracle pl/sql 中创建或替换表

Posted

技术标签:

【中文标题】在 Oracle pl/sql 中创建或替换表【英文标题】:Create or replace table in Oracle pl/sql 【发布时间】:2013-05-19 12:35:01 【问题描述】:

我需要一个脚本来创建表,或者如果它已经存在则删除它,并在重新创建表时。经过一番研究,我发现 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);

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

【问题讨论】:

根据您的尝试,临时表可能会有用。 不,我需要使用表,而不是临时表。不过谢谢你的建议。 我从来不明白这件事。只需删除表格 - 如果它存在,则不会造成任何伤害。 【参考方案1】:

您真的不应该在 PL/SQL 中这样做,在运行时创建的表将表明您的数据模型存在缺陷。如果你真的确信你绝对必须这样做,那么首先调查temporary tables。就个人而言,我会重新评估是否有必要。

您似乎正在采用EAFP as opposed to LBYL 方法,this question 的一些答案中对此进行了描述。我认为这是不必要的。表是一个相当静态的野兽,你可以在删除它之前使用系统视图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,我知道,在运行时重新创建表是不好的方法,但我必须完成交给我的任务。【参考方案2】:

使用全局temporary table 似乎是更好的选择。但是,如果您坚持在运行时删除和重新添加表,您可以查询 _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 - 领先我一分钟!

以上是关于在 Oracle pl/sql 中创建或替换表的主要内容,如果未能解决你的问题,请参考以下文章

#Oracle#PL/SQL:多个输入的替换变量

如何在 select 的 where 子句中替换 oracle pl/sql 变量

Oracle PL/SQL,如何使用简单的替换变量和months_between计算出生日期的年龄

oracle sql语句中,有没有能够将结果集中数字替换成汉字的函数?

获取oracle视图SQL语句的工具

如何在 PL/SQL 中使用 BULK COLLECT 和 FORALL 替换 CURSOR FOR LOOP?