2012-02-02 2 views
4

나는 이미 존재하는지 여부에 따라 열을 추가하거나 수정하는 명령을 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; 

그러나 오라클은 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; 
관련 문제