티스토리 뷰

■에러

ORA-00904: 부적합한 식별자입니다.

 

■원인1

식별자는 큰 따옴표(")로 묶어 사용된다.

많은 개발 언어에서 작은 따옴표(')와 큰 따옴표(")를 같은 의미로 사용할 수 있으나, 오라클에서는 각각 다른 의미를 가지고 있다.

작은 따옴표는 리터럴을 나타내지만, 큰 따옴표는 객체명을 나타내므로 ORA-00904 에러가 발생한다.

큰 따옴표(")로 둘러싼 식별자는 대문자 소문자를 구별한다.

따옴표로 묶지 않은 식별자는 항상 대문자로 변환되어 관리된다.

 

예제
 컬럼명 "abc" ≠ abc
 컬럼명 "한국어a" ≠ "한국어A"
 컬럼명 "ABC" = abc

 

■대응방법

큰 따옴표(")로 묶은 식별자를 사용하는 경우에는 대소문자까지 올바르게 기술한다.

 


■원인2

리터럴 항목을 작은 따옴표로 묶어 사용하지 않는다.

동적 SQL을 사용하는 경우 리터럴로 지정하는 항목을 문자열로 결합하려고 할 때 작은 따옴표로 묶는 것을 까먹는 경우가 있다.

 

vVal := '대입하려는 리터럴';
vSQL := 'INSERT INTO ... VALUES (' || vVal ||  ')';

이 SQL은 INSERT INTO ... VALUES (대입하려는 리터럴) 이 되어, ORA-00904 가 된다.

 

■대응방법

작은 따옴표(')를 대입하고 싶은 경우에는 작은 따옴표(')를 연속적으로 입력한다.

 

vVal := '대입하려는 리터럴'; 
vSQL := 'INSERT INTO ... VALUES (''' || vVal || ''')'; 
/* 또는 */
vVal := '''대입하려는 리터럴'''; 
vSQL : = 'INSERT INTO ... VALUES('|| vVal ||'')';

이 SQL은 INSERT INTO ... VALUES ('대입하려는 리터럴') 이 된다.

 

■대응방법(ver:10g)

vVal := q'{'대입하려는 리터럴'}';
vSQL := 'INSERT INTO ... VALUES ('|| vVal || ')';

오라클 버전이 10g면 위의 sql로도 가능하다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함