본문 바로가기
IT

ORA-00904 : 부적합한 식별자, 이것만 확인하면 해결

by 샤나엘 2026. 4. 8.
반응형

ORA-00904 : 부적합한 식별자, 이것만 확인하면 해결

오라클에서 가장 자주 마주치는 에러 중 하나가 ORA-00904 : invalid identifier입니다. 컬럼명 오타, 별칭 실수, 따옴표 혼동 등 원인이 다양하지만 패턴을 알면 금방 해결할 수 있습니다. 이 글에서는 ORA-00904가 발생하는 실전 상황별로 원인과 해결법을 정리합니다.

ORA-00904


ORA-00904 에러란?

ORA-00904는 SQL 문에서 참조한 컬럼명이나 식별자가 유효하지 않을 때 발생하는 에러입니다.

 

ORA-00904 에러란?

 

공식 메시지는 다음과 같습니다.

ORA-00904 : "식별자명" : invalid identifier
("식별자명" : 부적합한 식별자입니다)

에러 메시지에 문제가 되는 식별자명이 함께 표시되므로, 해당 이름을 중심으로 원인을 찾으면 됩니다. 대부분 컬럼명 관련 문제이지만, 테이블 별칭이나 함수명이 원인인 경우도 있습니다.


주요 발생 원인 5가지

번호 원인 설명
1 컬럼명 오타 ENAME을 ENME로 잘못 입력
2 존재하지 않는 컬럼 참조 다른 테이블의 컬럼을 착각하여 사용
3 별칭(Alias) 사용 실수 WHERE/GROUP BY에서 SELECT 별칭 사용
4 작은따옴표/큰따옴표 혼동 문자열에 큰따옴표를 사용
5 컬럼명에 소문자/특수문자 큰따옴표로 생성한 컬럼의 대소문자 불일치

원인 1 : 컬럼명 오타

가장 흔한 원인입니다. 컬럼명의 철자를 잘못 입력하면 바로 ORA-00904가 발생합니다.

 

컬럼명 오타

 

에러 발생 예시 :

-- 컬럼명 오타
SELECT ENMAE FROM employees;         -- ENAME의 오타
SELECT employee_id, salarry FROM employees;  -- salary의 오타
SELECT deptno FROM employees;        -- 이 테이블에 없는 컬럼

해결법 :

-- 1. 올바른 컬럼명 사용
SELECT ENAME FROM employees;
SELECT employee_id, salary FROM employees;

-- 2. 테이블의 컬럼 목록 확인
DESC employees;

-- 3. 데이터 딕셔너리에서 컬럼명 검색
SELECT column_name 
FROM user_tab_columns 
WHERE table_name = 'EMPLOYEES'
ORDER BY column_id;

컬럼명이 확실하지 않으면 DESC 테이블명 또는 USER_TAB_COLUMNS를 먼저 조회하는 습관을 들이세요.


원인 2 : 존재하지 않는 컬럼 참조

조인이나 서브쿼리에서 다른 테이블의 컬럼을 착각하여 사용하는 경우입니다.

에러 발생 예시 :

-- departments 테이블에는 salary 컬럼이 없음
SELECT d.department_name, d.salary
FROM departments d;
-- ORA-00904 : "D"."SALARY" : invalid identifier

-- 조인 시 테이블 별칭 없이 모호한 참조
SELECT department_name, salary
FROM employees e JOIN departments d ON e.department_id = d.department_id
WHERE department_name = 'IT';
-- department_name이 양쪽 테이블에 있으면 ORA-00918 발생
-- 한쪽에만 있는데 다른 테이블 별칭을 쓰면 ORA-00904 발생

 

해결법 :

-- 올바른 테이블에서 컬럼 참조 + 별칭 사용
SELECT d.department_name, e.salary
FROM employees e 
JOIN departments d ON e.department_id = d.department_id
WHERE d.department_name = 'IT';

-- 어떤 테이블에 어떤 컬럼이 있는지 확인
SELECT table_name, column_name
FROM user_tab_columns
WHERE column_name = 'SALARY';

원인 3 : 별칭(Alias) 사용 위치 실수

SELECT 절에서 지정한 별칭을 WHERE, GROUP BY, HAVING 절에서 사용하면 ORA-00904가 발생합니다. 오라클에서 SELECT 별칭은 ORDER BY에서만 사용할 수 있습니다.

 

별칭(Alias) 사용 위치 실수

 

에러 발생 예시 :

-- WHERE 절에서 별칭 사용 (불가)
SELECT salary * 12 AS annual_sal
FROM employees
WHERE annual_sal > 50000;    -- ORA-00904

-- GROUP BY에서 별칭 사용 (불가)
SELECT department_id AS dept, COUNT(*) AS cnt
FROM employees
GROUP BY dept;               -- ORA-00904

-- HAVING에서 별칭 사용 (불가)
SELECT department_id, AVG(salary) AS avg_sal
FROM employees
GROUP BY department_id
HAVING avg_sal > 5000;       -- ORA-00904

 

해결법 :

-- WHERE : 원래 표현식 사용
SELECT salary * 12 AS annual_sal
FROM employees
WHERE salary * 12 > 50000;

-- GROUP BY : 원래 컬럼명 사용
SELECT department_id AS dept, COUNT(*) AS cnt
FROM employees
GROUP BY department_id;

-- HAVING : 원래 표현식 사용
SELECT department_id, AVG(salary) AS avg_sal
FROM employees
GROUP BY department_id
HAVING AVG(salary) > 5000;

-- ORDER BY에서는 별칭 사용 가능
SELECT salary * 12 AS annual_sal
FROM employees
ORDER BY annual_sal DESC;
별칭 사용
WHERE 불가
GROUP BY 불가
HAVING 불가
ORDER BY 가능

원인 4 : 작은따옴표/큰따옴표 혼동

오라클에서 작은따옴표('')는 문자열, 큰따옴표("")는 식별자입니다. 이를 혼동하면 ORA-00904가 발생합니다.

에러 발생 예시 :

-- 문자열에 큰따옴표 사용 (식별자로 인식됨)
SELECT * FROM employees WHERE last_name = "Smith";
-- ORA-00904 : "Smith" : invalid identifier

-- 별칭에 작은따옴표 사용
SELECT salary AS '연봉' FROM employees;
-- ORA-00923 : FROM keyword not found

 

해결법 :

-- 문자열은 작은따옴표
SELECT * FROM employees WHERE last_name = 'Smith';

-- 별칭(한글/특수문자 포함)은 큰따옴표
SELECT salary AS "연봉" FROM employees;
구분 기호 용도 예시
작은따옴표 '' 문자열 값 WHERE name = 'Kim'
큰따옴표 "" 식별자(컬럼/테이블명) SELECT sal AS "급여"

원인 5 : 큰따옴표로 생성한 컬럼의 대소문자 문제

테이블 생성 시 큰따옴표로 컬럼명을 지정하면 대소문자가 그대로 저장됩니다. 이후 따옴표 없이 참조하면 오라클이 대문자로 변환하여 찾기 때문에 ORA-00904가 발생합니다.

 

큰따옴표로 생성한 컬럼의 대소문자 문제

 

에러 발생 예시 :

-- 소문자 컬럼명으로 생성
CREATE TABLE test_tbl ("userName" VARCHAR2(50), "eMail" VARCHAR2(100));

-- 따옴표 없이 조회 (USERNAME으로 변환됨)
SELECT userName FROM test_tbl;    -- ORA-00904
SELECT email FROM test_tbl;       -- ORA-00904

해결법 :

-- 방법 1 : 큰따옴표로 정확하게 참조
SELECT "userName", "eMail" FROM test_tbl;

-- 방법 2 : 테이블 재생성 (근본 해결)
CREATE TABLE test_tbl_new AS 
SELECT "userName" AS USERNAME, "eMail" AS EMAIL 
FROM test_tbl;

가급적 컬럼 생성 시 큰따옴표를 사용하지 않는 것이 좋습니다. 오라클은 기본적으로 모든 식별자를 대문자로 저장하므로, 따옴표 없이 만들면 대소문자 문제를 피할 수 있습니다.


자주 묻는 질문 (FAQ)

Q1. ORA-00904 에러 메시지에 나오는 식별자명이 맞는데 왜 에러가 나나요?

큰따옴표로 생성된 컬럼일 수 있습니다. USER_TAB_COLUMNS에서 정확한 컬럼명(대소문자)을 확인하세요.

 

Q2. 조인 쿼리에서 자꾸 ORA-00904가 발생합니다.

모든 컬럼에 테이블 별칭을 붙이세요. SELECT e.salary 처럼 명확하게 참조하면 대부분 해결됩니다.

 

Q3. SELECT 별칭을 WHERE에서 쓰고 싶으면 어떻게 하나요?

인라인 뷰(서브쿼리)를 활용하세요.

SELECT * FROM (
    SELECT salary * 12 AS annual_sal FROM employees
) WHERE annual_sal > 50000;

 

Q4. 컬럼명에 한글을 쓸 수 있나요?

큰따옴표로 감싸면 가능하지만, 매번 따옴표를 써야 하므로 권장하지 않습니다.


핵심 정리

점검 사항 확인 방법
컬럼명 철자 DESC 테이블명 또는 USER_TAB_COLUMNS 조회
컬럼 소속 테이블 조인 시 테이블 별칭 명확히 지정
별칭 사용 위치 WHERE/GROUP BY/HAVING에서 별칭 사용 불가
따옴표 구분 문자열 = 작은따옴표, 식별자 = 큰따옴표
대소문자 큰따옴표로 생성한 컬럼은 정확한 대소문자 필요

 

핵심 정리

 

태그 : ORA-00904, ORA-00904 해결, ORA-00904 원인, invalid identifier, 부적합한 식별자, 오라클 에러, 오라클 컬럼명 에러, 오라클 별칭 에러, 오라클 따옴표, 오라클 식별자, SELECT 별칭 WHERE, 오라클 조인 에러, 오라클 트러블슈팅, 데이터베이스 에러, SQL 에러 해결

반응형

댓글