2014-06-16 2 views
2

새 열 TEMPLATE을 생성하고 일부 기본 값으로 채워야하는 다음 Oracle SQL 스크립트를 실행하려고하는데 오류가 발생합니다. 10 행, 열 37 :
PL/SQL: ORA-00904: "TEMPLATE": invalid identifier간단한 스크립트를 실행하려고 할 때 SQL이 유효하지 않습니다.

수동으로 문을 실행하려고, 모든 것

DECLARE v_cnt INT; 

BEGIN 
    select count(*) into v_cnt 
    from user_tab_columns 
    where upper(table_name) = upper('myTable') and upper(column_name) = upper('template'); 

    IF(v_cnt = 0) THEN 
     EXECUTE IMMEDIATE 'ALTER TABLE MYTABLE ADD TEMPLATE NVARCHAR2(255)'; 

     UPDATE MYTABLE 
     SET TEMPLATE = 'BASE VALUE'; 
    END IF; 
    END;/

내가지고있어 오류가

ORA-06550이다 잘 작동하고 있습니다. 문제는 EXECUTE IMMEDIATE 부분과 관련이 있으며 익숙하지 않습니다. 예비 검색 후에 나는이 진술이 비동기 적이거나 그와 같은 것임을 결정할 수 없으므로 이론적으로 거기에 오류가 없어야합니다.

답변

2

질문을 게시 한 직후에 해결책을 찾았습니다. 이것은 실제로 컴파일 문제입니다. Oracle 컴파일러는 실행 전에 전체 스크립트를 읽고 스크립트 실행 직전에 존재하지 않는 열을 명시 적으로 업데이트하려고하기 때문에 예외가 발생합니다.

해결 방법은 UPDATE 문을 EXECUTE IMMEDIATE 블록에 넣는 것입니다.

.... 
EXECUTE IMMEDIATE 'UPDATE EGPL_USER_ROLE SET TEMPLATE = ''BASE VALUE'''; 
.... 
0

추가하려고하는 열 이름 TEMPLATE는 예약어입니다. ORA-00904를 보시고 예약어 목록 (http://docs.oracle.com/cd/E10530_01/doc/epm.931/html_esb_techref/maxl/ddl/keywords.htm)을보십시오.

이름을 'A_TEMPLATE'(으)로 변경하면 실행됩니다.

+0

이 경우인지 확실하지 않습니다. 아래에서 언급했듯이 모든 변경 작업을 완료했습니다. – Kon

+0

예, 변경 한 MYTABLE SET TEMPLATE = 'BASE VALUE'; 라인을 주석 처리했습니다. 나는 당신의 해결책에 동의합니다. –

+1

키워드 목록은 RDBMS가 아닌 Hyperion 용입니다. TEMPLATE는 [11gR2 목록]에 없습니다 (http://docs.oracle.com/cd/E18283_01/appdev.112/e10830/appb.htm). (MySQL 문서에 연결하는 사람이 * 8-로 바뀌 었음). –

관련 문제