2026년 06월 15일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-00904 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-00904 invalid identifier 는?
ORA-00904 에러는 SQL 문장에서 Oracle이 인식할 수 없는 컬럼명, 별칭(Alias), 또는 식별자를 사용했을 때 발생하는 에러입니다. 주로 컬럼명 오타, 존재하지 않는 컬럼 참조, 잘못된 큰따옴표 사용, 또는 예약어 충돌 등 다양한 원인으로 발생합니다. 이 에러는 SQL 파싱(Parsing) 단계에서 감지되므로 실제 데이터를 조회하기 전에 즉시 반환되며, 에러 메시지에 문제가 된 식별자 이름이 함께 표시되기 때문에 비교적 원인을 찾기 쉬운 편입니다.
주요 발생 원인
1. 컬럼명 오타 또는 존재하지 않는 컬럼 참조
가장 흔한 원인으로, 실제 테이블에 존재하지 않는 컬럼명을 SQL에서 사용하는 경우입니다. 개발자가 컬럼명을 잘못 기억하거나, 테이블 구조 변경(ALTER TABLE) 이후 컬럼이 삭제/변경되었음에도 기존 쿼리를 그대로 사용할 때 자주 발생합니다. 또한 대소문자 구분 없이 사용하다가 큰따옴표를 잘못 조합하는 경우에도 이 에러가 발생합니다.
2. SQL 문장 내 잘못된 별칭(Alias) 참조
SELECT 절에서 정의한 별칭을 WHERE 절이나 GROUP BY 절에서 직접 참조하려 할 때 발생합니다. Oracle SQL의 파싱 순서상 WHERE, HAVING 절은 SELECT 절보다 먼저 처리되기 때문에 SELECT에서 정의한 별칭을 WHERE에서 사용할 수 없습니다. 이를 모르는 개발자들이 서브쿼리나 CTE(WITH 절) 없이 별칭을 바로 참조하다가 이 에러를 자주 만납니다.
3. Oracle 예약어(Reserved Word)를 컬럼명으로 사용
Oracle SQL에는 수백 개의 예약어가 있으며, 이를 컬럼명이나 테이블명으로 사용하면 ORA-00904 에러가 발생할 수 있습니다. 예를 들어 LEVEL, COMMENT, DATE, NUMBER 등의 단어를 큰따옴표 없이 컬럼명으로 사용하면 Oracle이 이를 예약어로 해석하여 식별자로 인식하지 못합니다. 이 경우에는 반드시 큰따옴표(")로 감싸야 하며, 가능하면 예약어를 컬럼명으로 사용하지 않도록 설계 단계에서부터 방지해야 합니다.
해결 방법
원인 1 해결: 컬럼명 확인 및 수정
먼저 USER_TAB_COLUMNS 또는 ALL_TAB_COLUMNS 뷰를 조회하여 실제 컬럼명을 정확히 확인합니다.
-- 테이블의 실제 컬럼명 확인
SELECT COLUMN_NAME, DATA_TYPE, NULLABLE
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME = 'EMPLOYEES' -- 테이블명은 대문자로 입력
ORDER BY COLUMN_ID;
오타로 인한 에러 예시와 수정 방법:
-- 에러 발생: 컬럼명 오타 (EMPLYEE_ID는 존재하지 않음)
SELECT EMPLYEE_ID, FIRST_NAME, SALARY
FROM EMPLOYEES;
-- ORA-00904: "EMPLYEE_ID": invalid identifier
-- 수정된 쿼리
SELECT EMPLOYEE_ID, FIRST_NAME, SALARY
FROM EMPLOYEES;
원인 2 해결: 별칭(Alias) 올바르게 참조하기
WHERE 절에서 SELECT 별칭을 사용할 수 없으므로 서브쿼리 또는 CTE를 활용합니다.
-- 에러 발생: WHERE 절에서 SELECT 별칭 직접 참조
SELECT EMPLOYEE_ID, SALARY * 12 AS ANNUAL_SALARY
FROM EMPLOYEES
WHERE ANNUAL_SALARY > 60000;
-- ORA-00904: "ANNUAL_SALARY": invalid identifier
-- 해결 방법 1: 서브쿼리 사용
SELECT EMPLOYEE_ID, ANNUAL_SALARY
FROM (
SELECT EMPLOYEE_ID, SALARY * 12 AS ANNUAL_SALARY
FROM EMPLOYEES
)
WHERE ANNUAL_SALARY > 60000;
-- 해결 방법 2: CTE(WITH 절) 사용
WITH SALARY_CTE AS (
SELECT EMPLOYEE_ID, SALARY * 12 AS ANNUAL_SALARY
FROM EMPLOYEES
)
SELECT EMPLOYEE_ID, ANNUAL_SALARY
FROM SALARY_CTE
WHERE ANNUAL_SALARY > 60000;
-- 해결 방법 3: 원래 표현식을 WHERE에도 그대로 사용
SELECT EMPLOYEE_ID, SALARY * 12 AS ANNUAL_SALARY
FROM EMPLOYEES
WHERE SALARY * 12 > 60000;
원인 3 해결: 예약어 컬럼명 처리
예약어가 컬럼명으로 사용된 경우 큰따옴표로 감싸서 식별자임을 명시합니다.
-- 에러 발생: LEVEL은 Oracle 예약어
SELECT EMPLOYEE_ID, LEVEL
FROM EMPLOYEES;
-- ORA-00904: "LEVEL": invalid identifier (또는 계층 쿼리 관련 에러)
-- 해결 방법: 큰따옴표로 컬럼명 명시
SELECT EMPLOYEE_ID, "LEVEL"
FROM EMPLOYEES;
-- 예약어 여부 확인 방법
SELECT KEYWORD
FROM V$RESERVED_WORDS
WHERE KEYWORD = 'LEVEL';
-- 테이블 생성 시 예약어를 컬럼명으로 사용하는 잘못된 예
-- (이 방식은 운영에서 절대 비권장)
CREATE TABLE TEST_TABLE (
ID NUMBER,
"LEVEL" VARCHAR2(10), -- 큰따옴표 필수
"DATE" DATE -- 큰따옴표 필수
);
-- 올바른 설계: 예약어 사용 자체를 피함
CREATE TABLE TEST_TABLE (
ID NUMBER,
GRADE_LEVEL VARCHAR2(10), -- LEVEL 대신 GRADE_LEVEL 사용
REG_DATE DATE -- DATE 대신 REG_DATE 사용
);
추가 진단 팁: DBMS_METADATA 활용
-- 테이블의 DDL을 확인하여 정확한 컬럼 구조 파악
SELECT DBMS_METADATA.GET_DDL('TABLE', 'EMPLOYEES', USER)
FROM DUAL;
-- 뷰(VIEW)에서 ORA-00904 발생 시 뷰 정의 확인
SELECT TEXT
FROM USER_VIEWS
WHERE VIEW_NAME = 'YOUR_VIEW_NAME';
예방 방법
1. SQL 개발 시 IDE의 자동완성 및 유효성 검사 기능 활용
SQL Developer, DBeaver, Toad 등 DB 전용 IDE를 사용하면 컬럼명 자동완성 기능을 통해 오타를 사전에 방지할 수 있습니다. 쿼리를 작성하기 전에 반드시 DESC 테이블명 명령어 또는 USER_TAB_COLUMNS 조회를 통해 컬럼명을 확인하는 습관을 들이는 것이 중요합니다. 또한 코드 리뷰 프로세스에서 컬럼명 일치 여부를 체크리스트로 관리하면 운영 환경 배포 전에 대부분의 오타를 잡을 수 있습니다.
2. 테이블 설계 단계에서 예약어 및 특수 명명 규칙 배제
데이터베이스 설계 초기부터 Oracle 예약어 목록(V$RESERVED_WORDS)을 참조하여 컬럼명과 테이블명이 예약어와 겹치지 않도록 명명 규칙(Naming Convention)을 수립해야 합니다. _ID, _DATE, _CD, _NM 등의 접미사(Suffix)를 붙이는 방식으로 예약어 충돌을 원천적으로 방지하는 것이 바람직합니다. 큰따옴표를 사용한 대소문자 구분 식별자는 이후 모든 SQL에서 큰따옴표를 필수로 사용해야 하는 번거로움이 생기므로, 가능한 한 일반 식별자만 사용하는 것을 강력히 권장합니다.
관련 에러
- ORA-00942:
table or view does not exist— 테이블 또는 뷰 자체가 존재하지 않을 때 발생하며, ORA-00904와 함께 식별자 관련 에러로 자주 묶여서 언급됩니다. - ORA-01747:
invalid user.table.column, table.column, or column specification— 컬럼 참조 방식 자체가 잘못된 경우 발생하며, ORA-00904와 유사한 상황에서 나타날 수 있습니다. - ORA-00923:
FROM keyword not found where expected— SQL 문법 자체가 잘못되어 파서가 혼란을 겪을 때 발생하며, 복잡한 쿼리에서 ORA-00904와 연쇄적으로 발생하기도 합니다. - ORA-00932:
inconsistent datatypes— 잘못된 컬럼 참조와 함께 데이터 타입 불일치가 겹칠 때 발생할 수 있습니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.