[Oracle] ORA-00904: invalid identifier (부적합한 식별자) 원인과 해결 방안

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_SALARYWHERE 절에서 사용
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 오류를 마주쳤을 때, 아래 순서대로 확인해 보세요.

  1. 오타 확인: 참조하려는 컬럼명의 철자가 테이블 정의와 정확히 일치하는지 확인합니다.
  2. 테이블 별칭 확인: JOIN 사용 시 모든 컬럼이 올바른 테이블 별칭을 통해 참조되고 있는지 확인합니다.
  3. 쌍따옴표 사용 여부 확인: 식별자가 쌍따옴표로 생성되었는지 확인하고, 그렇다면 조회 시에도 동일한 형식을 사용했는지 점검합니다.
  4. 별칭 사용 위치 확인: WHERE 또는 GROUP BY 절에서 SELECT 절의 별칭을 사용하고 있지는 않은지 확인합니다.