ORA-00904: invalid identifier 오류는 SQL 문장에서 사용된 컬럼명(식별자)을 Oracle이 인식하지 못할 때 발생하는 구문 오류입니다. 이 오류는 가장 기본적인 실수인 오타부터 복잡한 쿼리 구조 문제에 이르기까지 다양한 원인으로 발생하여, SQL을 작성하는 개발자라면 누구나 한 번쯤은 마주치게 됩니다.
이번 포스팅에서는 ORA-00904 오류를 유발하는 핵심 시나리오들을 분석하고, 각 상황에 맞는 명확한 디버깅 및 해결 방법을 제시합니다.
주요 발생 시나리오 및 해결 방안
1. 단순 오타 또는 존재하지 않는 컬럼 사용 ✏️
가장 빈번하고 직관적인 원인입니다. 테이블에 존재하지 않는 컬럼명을 사용하거나 컬럼명의 철자를 잘못 입력한 경우입니다.
- 발생 예시:
EMPLOYEES테이블의EMPLOYEE_ID컬럼을EMP_ID로 잘못 입력한 경우
-- EMPLOYEE_ID가 올바른 컬럼명일 때 SELECT EMP_ID, LAST_NAME FROM EMPLOYEES; -- ORA-00904: "EMP_ID": 부적합한 식별자
- 원인 분석:
SELECT절에서 참조한EMP_ID라는 컬럼이EMPLOYEES테이블의 정의에 존재하지 않습니다. - 해결 방안:
DESC명령어 또는 데이터 딕셔너리를 조회하여 테이블의 정확한 컬럼명을 확인하고 쿼리를 수정합니다.
-- SQL*Plus 또는 SQL Developer에서 테이블 구조 확인 DESC EMPLOYEES; -- 데이터 딕셔너리 뷰(USER_TAB_COLUMNS)를 통해 컬럼명 확인 SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'EMPLOYEES';
2. 테이블 별칭(Alias) 사용 오류 🔗
JOIN 등 여러 테이블을 사용하는 쿼리에서 테이블 별칭(Alias)을 잘못 사용하면 ORA-00904 오류가 발생할 수 있습니다.
- 발생 예시:
EMPLOYEES테이블에 별칭E를 지정하고,DEPARTMENTS테이블의 컬럼을 별칭 없이 사용한 경우
SELECT E.EMPLOYEE_ID, DEPARTMENT_NAME FROM EMPLOYEES E, DEPARTMENTS D WHERE E.DEPARTMENT_ID = D.DEPARTMENT_ID; -- 양쪽 테이블에 동일한 이름의 컬럼이 없다면 모호성 오류(ORA-00918)가 발생하지만, -- 특정 상황이나 툴에서는 ORA-00904를 반환할 수도 있습니다. -- 더 명확한 예시: 별칭을 지정해놓고 원래 테이블명을 사용한 경우 SELECT EMPLOYEES.EMPLOYEE_ID -- 별칭 'E'를 사용해야 함 FROM EMPLOYEES E; -- ORA-00904: "EMPLOYEES"."EMPLOYEE_ID": 부적합한 식별자
- 원인 분석: 쿼리 파서가
FROM절에서 테이블에 별칭이 지정된 것을 인지하면, 해당 쿼리 블록 내에서는 반드시 별칭을 통해 컬럼을 참조해야 합니다. - 해결 방안:
FROM절에서 정의한 별칭을 일관되게 사용하여 컬럼을 참조하도록 쿼리를 수정합니다.
SELECT E.EMPLOYEE_ID, D.DEPARTMENT_NAME FROM EMPLOYEES E, DEPARTMENTS D WHERE E.DEPARTMENT_ID = D.DEPARTMENT_ID;
3. 쌍따옴표(“”) 사용으로 인한 대소문자 구분 문제 🔡
Oracle은 기본적으로 식별자(테이블명, 컬럼명 등)를 대문자로 저장하고 처리하므로 대소문자를 구분하지 않습니다. 하지만 쌍따옴표(")로 식별자를 감싸면, 입력된 대소문자를 그대로 인식하게 됩니다.
- 발생 예시: 컬럼명을 쌍따옴표로 감싸 소문자로 생성한 후, 일반적인 방식으로 조회
CREATE TABLE TEST_TBL ( "id" NUMBER, "name" VARCHAR2(10) ); -- 아래 쿼리는 오류 발생 SELECT id FROM TEST_TBL; -- ORA-00904: "ID": 부적합한 식별자
- 원인 분석: 테이블은
"id"라는 소문자 컬럼을 가지고 있지만, 쿼리는 대문자ID컬럼을 찾으려고 시도하기 때문에 오류가 발생합니다. - 해결 방안: 쌍따옴표로 생성한 식별자는 조회할 때도 반드시 쌍따옴표와 대소문자를 정확히 사용해야 합니다. 가급적 식별자 생성 시 쌍따옴표를 사용하지 않는 것이 일반적인 규칙입니다.
-- 올바른 조회 쿼리 SELECT "id" FROM TEST_TBL;
4. WHERE 또는 GROUP BY 절에서 SELECT 절의 컬럼 별칭 사용
SQL 쿼리의 논리적인 처리 순서 때문에 발생하는 문제입니다. WHERE 절은 FROM 절 다음, SELECT 절보다 먼저 처리되므로 SELECT 절에서 지정한 별칭을 WHERE 절에서는 아직 알지 못합니다.
- 발생 예시:
SELECT절에서 정의한 별칭ANNUAL_SALARY를WHERE절에서 사용
SELECT SALARY * 12 AS ANNUAL_SALARY FROM EMPLOYEES WHERE ANNUAL_SALARY > 60000; -- ORA-00904: "ANNUAL_SALARY": 부적합한 식별자
- 원인 분석:
WHERE절이 평가되는 시점에는ANNUAL_SALARY라는 식별자가 아직 정의되지 않았습니다. - 해결 방안:
WHERE절에 별칭 대신 원래의 표현식을 그대로 사용하거나, 인라인 뷰(Inline View) 또는 CTE(Common Table Expression)를 사용하여 쿼리를 재구성해야 합니다.
-- 해결 1: 표현식 반복 사용 SELECT SALARY * 12 AS ANNUAL_SALARY FROM EMPLOYEES WHERE (SALARY * 12) > 60000; -- 해결 2: 인라인 뷰(Subquery) 사용 SELECT ANNUAL_SALARY FROM (SELECT SALARY * 12 AS ANNUAL_SALARY FROM EMPLOYEES) WHERE ANNUAL_SALARY > 60000;
문제 해결 체크리스트 ✅
ORA-00904 오류를 마주쳤을 때, 아래 순서대로 확인해 보세요.
- 오타 확인: 참조하려는 컬럼명의 철자가 테이블 정의와 정확히 일치하는지 확인합니다.
- 테이블 별칭 확인:
JOIN사용 시 모든 컬럼이 올바른 테이블 별칭을 통해 참조되고 있는지 확인합니다. - 쌍따옴표 사용 여부 확인: 식별자가 쌍따옴표로 생성되었는지 확인하고, 그렇다면 조회 시에도 동일한 형식을 사용했는지 점검합니다.
- 별칭 사용 위치 확인:
WHERE또는GROUP BY절에서SELECT절의 별칭을 사용하고 있지는 않은지 확인합니다.