我如何使用CREATE OR REPLACE?

时间:2009-06-17 16:44:21

标签: oracle oracle10g ddl

我理解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')

我做了些蠢事吗?我似乎无法找到有关此语法的大量文档。

14 个答案:

答案 0 :(得分:140)

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

<强>更新

第三次更新帖子后,我将重新制定这个:

  

这不适用于表:)

是的,此语法有documentationREPLACE没有CREATE TABLE选项。

答案 1 :(得分:32)

语法的一个好处是你可以确定CREATE 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;
/

答案 2 :(得分:19)

Oracle中没有创建或替换表。

你必须:

DROP TABLE foo;
CREATE TABLE foo (....);

答案 3 :(得分:8)

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

答案 4 :(得分:4)

以下脚本应该在Oracle上做到这一点:

BEGIN
  EXECUTE IMMEDIATE 'drop TABLE tablename';
EXCEPTION
  WHEN OTHERS THEN
    IF sqlcode != -0942 THEN RAISE; 
    END IF;
END;

答案 5 :(得分:3)

不适用于Table,只适用于函数等。

这是一个包含examples的网站。

答案 6 :(得分:3)

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

答案 7 :(得分:2)

oracle数据库的一个有用的过程,不使用异常(在必须用dba_tables替换user_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;

答案 8 :(得分:1)

如果您正在使用代码,那么首先检查数据库中的表 通过使用查询  SELECT table_name   FROM user_tables  WHERE table_name ='XYZ'

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

像创建或替换一样工作。

答案 9 :(得分:1)

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

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

它保留了数据。

答案 10 :(得分:0)

所以我一直在使用它并且它运行得非常好: - 它更像是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;
/   

希望这会有所帮助 另请参考: PLS-00103 Error in PL/SQL Developer

答案 11 :(得分:0)

&#39;创建或替换表格&#39;不可能。正如其他人所述,您可以编写程序和/或立即使用begin execute(...)。因为我没有看到如何(重新)创建表格的答案,所以我把脚本作为答案。

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;

答案 12 :(得分: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)) ';

答案 13 :(得分:-3)

如果这是用于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 (...