Oracle ORA-00998 오류 원인과 해결 방법 완벽 가이드

ORA-00998
2026년 06월 25일 | DBMS Error 가이드

이 글에서 다루는 내용

ORA-00998 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.

ORA-00998 must name this expression with a column alias 는?

ORA-00998 에러는 Oracle 데이터베이스에서 CREATE VIEW 문이나 특정 쿼리를 작성할 때, SELECT 절에 포함된 표현식(Expression)에 컬럼 별칭(Column Alias)이 지정되지 않았을 경우 발생합니다. Oracle은 뷰(View)를 생성하거나 서브쿼리를 처리할 때 모든 컬럼에 명확한 이름이 존재해야 하며, 단순 컬럼명이 아닌 함수 호출, 산술 연산, DECODE, CASE 표현식 등의 복합 표현식에는 반드시 별칭을 부여해야 합니다. 이 에러는 특히 경험이 적은 개발자가 복잡한 뷰를 처음 생성하거나, 기존 테이블 구조를 변경한 후 뷰를 재생성할 때 자주 마주치게 됩니다.


주요 발생 원인

  • CREATE VIEW 문에서 표현식에 별칭 누락

가장 흔한 발생 원인으로, 뷰를 생성하는 CREATE VIEW 문의 SELECT 절에 함수, 산술 연산, 문자열 연결 등의 표현식이 포함되어 있지만 별칭이 지정되지 않은 경우입니다. Oracle은 뷰의 각 컬럼에 고유한 이름을 요구하기 때문에, 단순 컬럼 참조가 아닌 모든 표현식은 반드시 AS 키워드 또는 별칭을 사용하여 이름을 명시해야 합니다. 예를 들어 SELECT salary * 12 FROM emp처럼 계산식을 그대로 사용하면 이 에러가 발생합니다.

  • 집계 함수(Aggregate Function) 사용 시 별칭 미지정

SUM, AVG, COUNT, MAX, MIN 등의 집계 함수는 결과 컬럼에 자동으로 이름이 부여되지 않기 때문에, 이를 포함한 뷰나 인라인 뷰를 생성할 때 별칭이 없으면 ORA-00998이 발생합니다. 특히 GROUP BY와 함께 사용되는 복잡한 집계 쿼리에서는 여러 집계 함수를 동시에 사용하는 경우가 많아, 하나라도 별칭이 누락되면 에러가 발생하게 됩니다. 실무에서 리포팅용 뷰를 생성할 때 이 케이스가 매우 자주 나타납니다.

  • CASE, DECODE, 문자열 연결 연산자 사용 시 별칭 누락

CASE WHEN 문이나 DECODE 함수, 또는 || 연산자를 이용한 문자열 연결은 모두 Oracle이 자동으로 컬럼명을 결정할 수 없는 복합 표현식에 해당합니다. 이러한 표현식들을 CREATE VIEW 내에서 사용할 때 별칭을 생략하면 ORA-00998 에러가 즉시 발생하며, 실무에서는 고객 정보를 가공하거나 상태 코드를 텍스트로 변환하는 뷰에서 자주 발견됩니다.


해결 방법

원인 1 해결: 산술 표현식에 별칭 추가

잘못된 예시 (에러 발생):

-- ORA-00998 발생
CREATE VIEW v_emp_salary AS
SELECT 
    employee_id,
    first_name,
    salary * 12,          -- 별칭 없는 산술 표현식
    salary * 1.1
FROM employees;

올바른 예시 (수정 후):

-- 정상 실행
CREATE VIEW v_emp_salary AS
SELECT 
    employee_id,
    first_name,
    salary * 12        AS annual_salary,     -- 별칭 추가
    salary * 1.1       AS adjusted_salary    -- 별칭 추가
FROM employees;

원인 2 해결: 집계 함수에 별칭 추가

잘못된 예시 (에러 발생):

-- ORA-00998 발생
CREATE VIEW v_dept_stats AS
SELECT 
    department_id,
    COUNT(*),             -- 별칭 없는 집계 함수
    AVG(salary),          -- 별칭 없는 집계 함수
    SUM(salary)           -- 별칭 없는 집계 함수
FROM employees
GROUP BY department_id;

올바른 예시 (수정 후):

-- 정상 실행
CREATE VIEW v_dept_stats AS
SELECT 
    department_id,
    COUNT(*)              AS emp_count,       -- 별칭 추가
    AVG(salary)           AS avg_salary,      -- 별칭 추가
    SUM(salary)           AS total_salary     -- 별칭 추가
FROM employees
GROUP BY department_id;

원인 3 해결: CASE, DECODE, 문자열 연결에 별칭 추가

잘못된 예시 (에러 발생):

-- ORA-00998 발생
CREATE VIEW v_emp_info AS
SELECT 
    employee_id,
    first_name || ' ' || last_name,          -- 별칭 없는 문자열 연결
    CASE 
        WHEN salary >= 10000 THEN 'HIGH'
        WHEN salary >= 5000  THEN 'MEDIUM'
        ELSE 'LOW'
    END,                                      -- 별칭 없는 CASE 표현식
    DECODE(job_id, 'IT_PROG', 'Developer', 
                   'SA_MAN',  'Sales Mgr',
                   'Other')                   -- 별칭 없는 DECODE
FROM employees;

올바른 예시 (수정 후):

-- 정상 실행
CREATE VIEW v_emp_info AS
SELECT 
    employee_id,
    first_name || ' ' || last_name           AS full_name,         -- 별칭 추가
    CASE 
        WHEN salary >= 10000 THEN 'HIGH'
        WHEN salary >= 5000  THEN 'MEDIUM'
        ELSE 'LOW'
    END                                       AS salary_grade,      -- 별칭 추가
    DECODE(job_id, 'IT_PROG', 'Developer', 
                   'SA_MAN',  'Sales Mgr',
                   'Other')                   AS job_description    -- 별칭 추가
FROM employees;

뷰 컬럼명을 선두에서 일괄 지정하는 방법 (대안)

Oracle에서는 CREATE VIEW 선언부에서 모든 컬럼명을 미리 나열하는 방식으로도 에러를 해결할 수 있습니다. 이 방법은 SELECT 절이 매우 복잡한 경우 가독성을 높여주는 장점이 있습니다.

-- 뷰 정의부에서 컬럼명 일괄 지정
CREATE VIEW v_emp_summary (
    emp_id,
    full_name,
    annual_salary,
    salary_grade
) AS
SELECT 
    employee_id,
    first_name || ' ' || last_name,
    salary * 12,
    CASE 
        WHEN salary >= 10000 THEN 'HIGH'
        WHEN salary >= 5000  THEN 'MEDIUM'
        ELSE 'LOW'
    END
FROM employees;

예방 방법

  • 뷰 생성 전 SELECT 문 단독 실행으로 사전 검증하기

CREATE VIEW 문을 바로 실행하기 전에, SELECT 절만 먼저 실행하여 모든 컬럼에 명확한 이름이 부여되는지 확인하는 습관을 들이는 것이 중요합니다. SQL Developer나 Toad 같은 IDE에서는 쿼리 결과 그리드에 컬럼명이 표현식 그대로 표시될 경우 별칭이 없는 것이므로, 이를 시각적으로 확인한 후 뷰 생성 스크립트에 반영하면 ORA-00998을 사전에 방지할 수 있습니다. 코드 리뷰 단계에서도 함수나 연산이 포함된 컬럼에 별칭이 명시되었는지를 반드시 체크하도록 팀 내 코딩 컨벤션을 수립하는 것을 권장합니다.

  • 코딩 표준에 “모든 표현식에는 의미 있는 별칭 필수” 원칙 도입

단순 컬럼 참조가 아닌 모든 표현식(함수, 연산, CASE, DECODE 등)에는 반드시 의미 있는 별칭을 부여하도록 팀 또는 조직 차원의 SQL 코딩 표준을 수립하고 코드 리뷰 체크리스트에 포함시키는 것이 효과적입니다. 이렇게 하면 ORA-00998 에러를 예방하는 것은 물론, 코드 가독성이 높아지고 유지보수성도 크게 향상됩니다. CI/CD 파이프라인에 SQL Lint 도구(예: SQLFluff)를 통합하면 별칭 누락 여부를 자동으로 감지할 수 있어 더욱 효과적입니다.


관련 에러

  • ORA-00997: illegal use of LONG datatype — 뷰에서 LONG 타입 컬럼 사용 시 발생하며, 뷰 생성 제약과 관련된 유사 에러입니다.
  • ORA-00904: invalid identifier — 잘못된 컬럼명이나 별칭을 사용할 때 발생하며, 별칭 관련 작업 중 함께 마주칠 수 있습니다.
  • ORA-01730: invalid number of column names specified — CREATE VIEW 선언부에서 지정한 컬럼명 수와 SELECT 절의 컬럼 수가 불일치할 때 발생하며, 컬럼 별칭 일괄 지정 방식 사용 시 주의가 필요합니다.
  • ORA-00957: duplicate column name — 뷰나 서브쿼리에서 동일한 컬럼명 또는 별칭이 중복될 때 발생하며, 별칭을 추가하는 과정에서 실수로 중복이 발생할 수 있어 주의가 필요합니다.

DBMS 에러 코드 시리즈

주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.

본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.

댓글 남기기