2009-06-17 94 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;