2009-06-17 102 views
76

我的理解是:CREATE OR REPLACE基本上意味着“如果对象存在,放弃它,然后创建它”?如何使用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') 

我做一些愚蠢的事?我似乎无法找到关于此语法的很多文档。

回答

120

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

更新:

更新后第三次之后,我会重新制定这样的:

这不会对表:)

是的工作,该语法上有documentationCREATE TABLE没有REPLACE选项。

+1

叹了口气,我发誓我读了它在某处。好吧。 :) – 2009-06-17 16:54:29

+5

它也不适用于物化视图 – skaffman 2009-06-17 17:02:49

+3

它也不适用于数据库链接。 – 2014-01-23 13:31:03

19

Oracle中没有创建或替换表。

您必须:

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

CREATE OR REPLACE只能用于函数,过程,类型,视图或包 - 它不会在表上工作。

+1

`CREATE OR REPLACE`也适用于同义词和触发器 – 2014-07-23 08:32:11

-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 (... 
+0

对不起,但这是Oracle。 :-) – 2009-06-17 18:26:01

31

一个关于语法的好处之一是,你可以肯定的是一个CREATE OR REPLACE绝不会导致你失去的数据(你将失去最多的是代码,希望你能已经存储在源代码控制某处)。

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

编辑: 顺便说一句,如果你需要做一个DROP +在脚本创建,你不照顾假“对象不存在”的错误(当降不找到表),你可以这样做:

BEGIN 
    EXECUTE IMMEDIATE 'DROP TABLE owner.mytable'; 
EXCEPTION 
    WHEN OTHERS THEN 
    IF sqlcode != -0942 THEN RAISE; END IF; 
END; 
/
4

下面的脚本应该做甲骨文的伎俩:

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

如果通过代码实现然后通过查询首先检查数据库 表SELECT TABLE_NAME FROM USER_TABLES 在表格名= 'XYZ'

如果记录中发现,然后截断表,否则创建表像创建或替换

工作。

1

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

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

它保留数据。

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

所以我一直在使用这一点,它一直非常好: - 它的工作原理更像是一个跌落如果存在,但能够完成

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

0

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

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;