2012-02-02 33 views
4

我試圖在Oracle中編寫一個命令,根據它是否已存在,將會暫停ADD或MODIFY列。基本上是這樣的:在修改Oracle中的表時捕獲異常

BEGIN 

    ALTER TABLE MY_TABLE ADD (COL_NAME VARCHAR2(100); 

    EXCEPTION WHEN OTHERS THEN 
    ALTER TABLE MY_TABLE MODIFY (COL_NAME VARCHAR2(100)); 

END; 

但是,Oracle主訴其BEGIN內的ALTER命令。有沒有辦法在Oracle中使用單個SQL命令來實現這一點?

謝謝!

回答

6

爲了將DDL放入PL/SQL塊中,您需要使用動態SQL。

就我個人而言,我會檢查列是否存在,然後發出DDL。像

DECLARE 
    l_cnt INTEGER; 
BEGIN 
    SELECT COUNT(*) 
    INTO l_cnt 
    FROM dba_tab_cols 
    WHERE table_name = 'MY_TABLE' 
    AND owner  = <<owner of table>> 
    AND column_name = 'COL_NAME'; 

    IF(l_cnt = 0) 
    THEN 
    EXECUTE IMMEDIATE 'ALTER TABLE my_table ADD(col_name VARCHAR2(100))'; 
    ELSE 
    EXECUTE IMMEDIATE 'ALTER TABLE my_table MODIFY(col_name VARCHAR2(100))'; 
    END IF; 
END; 

的東西,如果你沒有訪問DBA_TAB_COLS,你也可以使用這取決於架構表駐留在你對錶有哪些特權ALL_TAB_COLSUSER_TAB_COLS

+0

謝謝,我剛剛發現了一個類似問題的帖子,併發布了一個幾乎與你相同的答案! – Paul 2012-02-02 16:21:04

3

我找到了一個基於this post的解決方案。

DECLARE v_column_exists number := 0; 
BEGIN 
    SELECT COUNT(*) INTO v_column_exists 
    FROM ALL_TAB_COLUMNS 
    WHERE TABLE_NAME = 'MY_TABLE' 
    AND COLUMN_NAME = 'COL_NAME'; 

    IF (v_column_exists = 0) THEN 
    EXECUTE IMMEDIATE 'ALTER TABLE MY_TABLE ADD (COL_NAME VARCHAR2(200))'; 
    ELSE 
    EXECUTE IMMEDIATE 'ALTER TABLE MY_TABLE MODIFY (COL_NAME VARCHAR2(200))'; 
    END IF; 
END;