2026년 06월 19일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-00932 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-00932 inconsistent datatypes 는?
ORA-00932 에러는 Oracle SQL 또는 PL/SQL 구문에서 서로 호환되지 않는 데이터 타입을 함께 사용하려고 할 때 발생하는 에러입니다. 예를 들어, 숫자형 컬럼과 문자형 값을 비교하거나, 날짜형 데이터를 숫자 연산에 직접 사용하는 경우 Oracle 옵티마이저가 내부적으로 타입 변환을 수행할 수 없을 때 이 에러가 발생합니다. 이 에러는 단순한 SELECT 쿼리부터 복잡한 PL/SQL 프로시저, 심지어 ORM(Object-Relational Mapping) 프레임워크를 통한 쿼리에서도 빈번하게 발생하므로 정확한 원인 파악이 중요합니다.
주요 발생 원인
1. 비교 연산 또는 조건절에서의 데이터 타입 불일치
가장 흔한 원인으로, WHERE 절이나 JOIN 조건에서 서로 다른 데이터 타입을 직접 비교할 때 발생합니다. 예를 들어 NUMBER 타입의 컬럼에 문자열 리터럴을 비교하거나, DATE 타입 컬럼에 숫자를 직접 비교하는 경우가 대표적입니다. Oracle은 일부 암묵적 변환(Implicit Conversion)을 지원하지만, 변환이 불가능한 값이 들어오거나 LOB, CLOB 같은 특수 타입이 포함되면 즉시 ORA-00932가 발생합니다.
2. UNION / UNION ALL 쿼리에서의 컬럼 타입 불일치
UNION 또는 UNION ALL 연산자를 사용할 때, 각 SELECT 절에서 동일한 순서의 컬럼들은 서로 호환 가능한 데이터 타입이어야 합니다. 첫 번째 쿼리에서 DATE 타입 컬럼을 조회하고, 두 번째 쿼리에서 같은 위치에 VARCHAR2 컬럼을 조회하면 Oracle은 해당 컬럼들의 타입을 통합할 수 없어 에러를 발생시킵니다. 이 문제는 여러 개발자가 각각 서브쿼리를 작성한 후 합칠 때 특히 자주 발생합니다.
3. 함수 인자(Argument)에 잘못된 데이터 타입 전달
Oracle 내장 함수나 사용자 정의 함수(UDF)에 함수가 요구하는 데이터 타입과 다른 타입의 값을 전달할 때 이 에러가 발생합니다. 예를 들어, SUM()이나 AVG() 같은 집계 함수에 VARCHAR2 타입의 컬럼을 명시적 변환 없이 넣거나, TO_DATE() 함수의 결과를 다시 숫자 연산에 바로 사용하는 경우가 해당됩니다. PL/SQL에서 OUT 파라미터나 변수에 잘못된 타입을 할당할 때도 동일한 에러가 발생할 수 있습니다.
해결 방법
원인 1 해결: 명시적 타입 변환(Explicit Conversion) 사용
암묵적 변환에 의존하지 말고, TO_NUMBER(), TO_CHAR(), TO_DATE() 등의 변환 함수를 명시적으로 사용하는 것이 가장 안전한 해결책입니다.
-- 문제 발생 예시: NUMBER 컬럼에 문자열 비교
SELECT *
FROM employees
WHERE employee_id = '100A'; -- ORA-00932 발생 가능
-- 해결 방법 1: 리터럴 값을 올바른 타입으로 수정
SELECT *
FROM employees
WHERE employee_id = 100;
-- 문제 발생 예시: DATE 컬럼을 문자열과 비교
SELECT *
FROM orders
WHERE order_date = '20240101'; -- 암묵적 변환 실패 가능
-- 해결 방법 2: TO_DATE() 함수를 사용한 명시적 변환
SELECT *
FROM orders
WHERE order_date = TO_DATE('20240101', 'YYYYMMDD');
-- 문제 발생 예시: CLOB 컬럼을 일반 문자열 함수와 사용
SELECT *
FROM documents
WHERE UPPER(doc_content) = 'ORACLE'; -- CLOB에 UPPER 적용 시 에러
-- 해결 방법 3: DBMS_LOB 또는 TO_CHAR 변환 사용
SELECT *
FROM documents
WHERE UPPER(DBMS_LOB.SUBSTR(doc_content, 100, 1)) = 'ORACLE';
원인 2 해결: UNION 쿼리의 컬럼 타입 통일
UNION 쿼리에서 각 SELECT의 동일 위치 컬럼 타입을 명시적으로 맞춰주어야 합니다.
-- 문제 발생 예시: UNION에서 타입 불일치
SELECT employee_id, hire_date -- hire_date: DATE 타입
FROM employees
UNION ALL
SELECT dept_id, dept_name -- dept_name: VARCHAR2 타입 → 에러!
FROM departments;
-- 해결 방법: 타입을 명시적으로 통일
SELECT employee_id, TO_CHAR(hire_date, 'YYYY-MM-DD') AS info_date
FROM employees
UNION ALL
SELECT dept_id, dept_name
FROM departments;
-- 또 다른 예: NUMBER 타입 통일
SELECT product_id, unit_price -- NUMBER
FROM products
UNION ALL
SELECT order_id, TO_NUMBER(discount_rate) -- VARCHAR2를 NUMBER로 변환
FROM order_details;
원인 3 해결: 함수 인자 타입 검증 및 변환
집계 함수나 분석 함수 사용 시 인자의 타입을 사전에 확인하고 변환하여 사용합니다.
-- 문제 발생 예시: VARCHAR2 컬럼을 집계 함수에 사용
SELECT SUM(salary_text) -- salary_text가 VARCHAR2이면 에러
FROM employee_payroll;
-- 해결 방법: TO_NUMBER로 명시적 변환 후 집계
SELECT SUM(TO_NUMBER(salary_text))
FROM employee_payroll
WHERE REGEXP_LIKE(salary_text, '^\d+(\.\d+)?$'); -- 숫자 형식 검증 포함
-- PL/SQL 변수 타입 불일치 해결 예시
DECLARE
v_salary NUMBER;
v_hire_date DATE;
BEGIN
-- 잘못된 예: 타입 불일치
-- v_salary := '50000ABC'; -- ORA-00932
-- 올바른 예: 명시적 변환
v_salary := TO_NUMBER('50000');
v_hire_date := TO_DATE('2024-01-15', 'YYYY-MM-DD');
DBMS_OUTPUT.PUT_LINE('Salary: ' || v_salary);
DBMS_OUTPUT.PUT_LINE('Hire Date: ' || TO_CHAR(v_hire_date, 'YYYY-MM-DD'));
END;
/
-- GROUP BY와 집계 함수에서의 타입 확인
SELECT
department_id,
AVG(TO_NUMBER(performance_score)) AS avg_score -- VARCHAR2 → NUMBER 변환
FROM
employee_performance
WHERE
REGEXP_LIKE(performance_score, '^\d+$')
GROUP BY
department_id;
예방 방법
1. 테이블 설계 단계에서 올바른 데이터 타입 지정 및 명시적 변환 코딩 원칙 수립
데이터베이스 설계 시 각 컬럼의 데이터 타입을 비즈니스 요구사항에 맞게 정확히 정의해야 합니다. 숫자 데이터는 반드시 NUMBER 타입으로, 날짜 데이터는 DATE 또는 TIMESTAMP 타입으로 지정하여 문자열로 저장하는 관행을 피해야 합니다. 개발 코딩 가이드라인에 “암묵적 타입 변환 금지, 명시적 변환 함수 필수 사용”을 원칙으로 명문화하고, 코드 리뷰 단계에서 이를 반드시 검수하는 프로세스를 구축하면 ORA-00932를 포함한 다양한 데이터 타입 관련 에러를 사전에 방지할 수 있습니다.
2. SQL 개발 및 배포 전 정적 분석 도구와 단위 테스트 적용
SQL Developer, PL/SQL Developer, SonarQube 등의 정적 분석 도구를 CI/CD 파이프라인에 통합하여 개발 단계에서 타입 불일치 문제를 조기에 탐지합니다. 특히 UNION 쿼리나 복잡한 조인이 포함된 SQL의 경우, 다양한 데이터 타입 조합에 대한 단위 테스트를 작성하여 실제 운영 환경 배포 전에 잠재적인 ORA-00932 발생 가능성을 검증하는 것이 바람직합니다.
관련 에러
- ORA-01722 (invalid number): 문자열을 NUMBER로 암묵적 변환하려 할 때 변환 불가능한 값이 있을 경우 발생하며, ORA-00932와 함께 타입 변환 에러의 대표적인 쌍입니다.
- ORA-01858 (a non-numeric character was found where a numeric was expected): 날짜 형식 변환 시 형식 문자열과 실제 값이 맞지 않을 때 발생합니다.
- ORA-06502 (PL/SQL: numeric or value error): PL/SQL 변수에 호환되지 않는 값을 할당하려 할 때 발생하며, ORA-00932의 PL/SQL 버전 에러로 볼 수 있습니다.
- ORA-00904 (invalid identifier): 컬럼명이나 별칭 오류와 함께 타입 문제가 복합적으로 나타날 때 함께 발생하는 경우가 있습니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.