2013-05-19 43 views
3

我需要一個腳本來創建表格,或者如果它已經存在,則刪除它並重新創建表格。經過一番研究,我發現pl/sql中的CREATE OR REPLACE TABLE不存在。所以我想出了這個腳本:在Oracle中創建或替換表格pl/sql

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

是否有任何正確的方法來實現這個功能?

+0

根據你正在嘗試什麼,也許臨時表會很有用。 –

+0

nope,我需要使用表格,而不是臨時表格。但是,謝謝你的建議。 – kuldarim

+0

我從來沒有理解這件事。只需放下桌子 - 如果存在劑量,那麼不會造成傷害。 – haki

回答

5

使用全球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(...)'; 

分享和享受。

+0

@本 - 打我一分鐘! –

9

你真的不應該在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; 
/
+0

謝謝Ben,我知道,在運行時重新創建表是不好的方法,但我必須完成給予我的任務。 – kuldarim