117

我是否正确理解 CREATE OR REPLACE 基本上意味着“如果对象存在,则删除它,然后以任何一种方式创建它?”

如果是这样,我做错了什么?这有效:

CREATE TABLE foo (id NUMBER,
title VARCHAR2(4000) DEFAULT 'Default Title')

这不会(ORA-00922:缺少或无效选项):

CREATE OR REPLACE TABLE foo (id NUMBER,
title VARCHAR2(4000) DEFAULT 'Default Title')

我在做傻事吗?我似乎无法找到有关此语法的太多文档。

4

14 回答 14

173

这适用于函数、过程、包、类型、同义词、触发器和视图。

更新:

第三次更新帖子后,我将重新表述:

这不适用于表:)

是的,有关于这种语法的文档并且没有.REPLACECREATE TABLE

于 2009-06-17T16:48:58.693 回答
34

语法的好处之一是您可以确保 aCREATE OR REPLACE永远不会导致您丢失数据(您将丢失的最多的是代码,希望您将其存储在源代码控制中的某个地方)。

表的等效语法是 ALTER,这意味着您必须显式枚举所需的确切更改。

编辑: 顺便说一句,如果您需要在脚本中执行 DROP + CREATE,并且您不关心虚假的“对象不存在”错误(当 DROP 找不到表时),您可以这样做这:

BEGIN
  EXECUTE IMMEDIATE 'DROP TABLE owner.mytable';
EXCEPTION
  WHEN OTHERS THEN
    IF sqlcode != -0942 THEN RAISE; END IF;
END;
/
于 2009-06-18T02:05:42.907 回答
25

Oracle 中没有创建或替换表。

你必须:

删除表 foo;
创建表 foo (....);
于 2009-06-17T16:49:06.103 回答
12

CREATE OR REPLACE只能用于函数、过程、类型、视图或包 - 它不适用于表。

于 2009-06-17T16:50:49.067 回答
5

以下脚本应该在 Oracle 上发挥作用:

BEGIN
  EXECUTE IMMEDIATE 'drop TABLE tablename';
EXCEPTION
  WHEN OTHERS THEN
    IF sqlcode != -0942 THEN RAISE; 
    END IF;
END;
于 2010-03-15T21:11:37.540 回答
4

不适用于表格,仅适用于函数等。

这是一个带有一些示例的站点。

于 2009-06-17T16:50:26.277 回答
4

不使用异常的 oracle 数据库的有用过程(在某些情况下,您必须将 user_tables 替换为 dba_tables 和/或限制查询中的表空间):

create or replace procedure NG_DROP_TABLE(tableName varchar2)
is
   c int;
begin
   select count(*) into c from user_tables where table_name = upper(tableName);
   if c = 1 then
      execute immediate 'drop table '||tableName;
   end if;
end;
于 2014-04-19T15:43:35.667 回答
4
-- To Create or Replace a Table we must first silently Drop a Table that may not exist
DECLARE
  table_not_exist EXCEPTION;
  PRAGMA EXCEPTION_INIT (table_not_exist , -00942);
BEGIN
   EXECUTE IMMEDIATE('DROP TABLE <SCHEMA>.<TABLE NAME> CASCADE CONSTRAINTS');
   EXCEPTION WHEN table_not_exist THEN NULL;
END;
/
于 2014-08-22T15:10:49.800 回答
1

如果您在代码中进行操作,则首先使用查询 SELECT table_name FROM user_tables WHERE table_name = 'XYZ' 检查数据库中的表

如果找到记录,则截断表,否则创建表

像创建或替换一样工作。

于 2013-12-24T06:22:24.497 回答
1

您可以使用 CORT ( www.softcraftltd.co.uk/cort )。该工具允许在 Oracle 中创建或替换表。看起来像:

create /*# or replace */ table MyTable(
  ... -- standard table definition
);

它保存数据。

于 2014-01-12T00:50:48.990 回答
1

所以我一直在使用它并且效果很好: - 它更像是 DROP IF EXISTS 但可以完成工作

DECLARE
       VE_TABLENOTEXISTS EXCEPTION;
PRAGMA EXCEPTION_INIT(VE_TABLENOTEXISTS, -942);


    PROCEDURE DROPTABLE(PIS_TABLENAME IN VARCHAR2) IS
              VS_DYNAMICDROPTABLESQL VARCHAR2(1024);
                    BEGIN
                       VS_DYNAMICDROPTABLESQL := 'DROP TABLE ' || PIS_TABLENAME;  
                    EXECUTE IMMEDIATE VS_DYNAMICDROPTABLESQL;

                    EXCEPTION
                        WHEN VE_TABLENOTEXISTS THEN
                             DBMS_OUTPUT.PUT_LINE(PIS_TABLENAME || ' NOT EXIST, SKIPPING....');
                        WHEN OTHERS THEN
                             DBMS_OUTPUT.PUT_LINE(SQLERRM);
                    RAISE;
                    END DROPTABLE;

    BEGIN
      DROPTABLE('YOUR_TABLE_HERE');
END DROPTABLE;
/   

希望这有帮助 另请参考: PL/SQL Developer 中的 PLS-00103 错误

于 2017-06-08T18:48:57.793 回答
1

“创建或替换表”是不可能的。正如其他人所说,您可以编写一个过程和/或立即使用开始执行(...)。因为我没有看到如何(重新)创建表的答案,所以我将脚本作为答案。

PS:根据 jeffrey-kemp 提到的内容:下面的脚本不会保存您要删除的表中已经存在的数据。由于存在丢失数据的风险,我们公司只允许修改生产环境中已有的表,不允许删除表。通过使用 drop table 语句,您迟早会让公司警察站在您的办公桌前。

--Create the table 'A_TABLE_X', and drop the table in case it already is present
BEGIN
EXECUTE IMMEDIATE 
'
CREATE TABLE A_TABLE_X
(
COLUMN1 NUMBER(15,0),
COLUMN2  VARCHAR2(255 CHAR),
COLUMN3  VARCHAR2(255 CHAR)
)';

EXCEPTION
WHEN OTHERS THEN
  IF SQLCODE != -955 THEN -- ORA-00955: object name already used
     EXECUTE IMMEDIATE 'DROP TABLE A_TABLE_X';
  END IF;
END;
于 2017-06-22T03:45:46.687 回答
0

我会做这样的事情

  begin
     for i in (select table_name from user_tables where table_name = 'FOO') loop
        execute immediate 'drop table '||i.table_name;
     end loop;
  end;

  execute immediate 'CREATE TABLE FOO (id NUMBER,
                                       title VARCHAR2(4000)) ';
于 2020-05-20T11:41:18.443 回答
-4

如果这是针对 MS SQL.. 无论表是否已经存在,以下代码将始终运行。

if object_id('mytablename') is not null //has the table been created already in the db
Begin
     drop table mytablename
End

Create table mytablename (...
于 2009-06-17T17:09:48.800 回答