2012-02-02 16 views
4

私は、すでに存在するかどうかに応じて列を追加または修正するコマンドをOracleに書き込もうとしています。基本的には次のようになります。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を発行します。あなたはDBA_TAB_COLSへのアクセス権を持っていない場合

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; 

のようなものは、あなたもALL_TAB_COLSまたはUSER_TAB_COLSは、テーブルが常駐し、どのような権限は、テーブルの上に持っているものスキーマに応じて使用することができます。

+0

ありがとう、私はちょうど同様の問題を持つ別の投稿を見つけて、あなたとほぼ同じ答えを投稿しました! – Paul

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; 
関連する問題