2026년 06월 14일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-00902 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-00902 invalid datatype 란?
ORA-00902 에러는 Oracle SQL 문장에서 지원하지 않거나 잘못된 데이터 타입을 사용했을 때 발생하는 에러입니다. CREATE TABLE, ALTER TABLE, 또는 CAST 함수 등에서 데이터 타입 이름을 잘못 입력하거나 Oracle에서 허용되지 않는 타입을 사용할 경우 이 에러가 발생합니다. 특히 다른 DBMS(MySQL, SQL Server 등)에서 Oracle로 마이그레이션 할 때 자주 접하게 되는 에러로, 데이터 타입의 문법 차이로 인해 빈번하게 발생합니다.
주요 발생 원인
1. 다른 DBMS의 데이터 타입을 Oracle에서 그대로 사용한 경우
MySQL, SQL Server, PostgreSQL 등에서 사용하는 데이터 타입을 Oracle에서 그대로 사용하면 ORA-00902가 발생합니다. 예를 들어 MySQL의 INT, TINYINT, DATETIME, BOOL 같은 타입은 Oracle에서 지원하지 않거나 다른 이름으로 사용해야 합니다. 마이그레이션 작업 시 DDL 스크립트를 Oracle 문법에 맞게 변환하지 않으면 반드시 이 에러를 마주치게 됩니다.
2. 데이터 타입 이름의 오타 또는 잘못된 문법 사용
데이터 타입 이름을 잘못 입력하거나 축약형을 잘못 사용하는 경우에도 이 에러가 발생합니다. 예를 들어 VARCHAR 대신 VARCAR, NUMBER 대신 NUMBR 처럼 오타가 있으면 Oracle 파서가 해당 키워드를 인식하지 못합니다. 또한 CHARACTER VARYING 처럼 Oracle에서 지원하지 않는 ANSI 표준 표현을 사용하는 경우에도 동일한 에러가 발생할 수 있습니다.
3. CAST 또는 CONVERT 함수에서 잘못된 타입 지정
CAST() 함수나 동적 SQL 내부에서 잘못된 데이터 타입을 지정하면 ORA-00902가 발생합니다. 특히 CAST(column AS INT) 처럼 Oracle에서 허용되지 않는 타입을 CAST 대상으로 사용할 때 에러가 납니다. 동적 SQL이나 ORM 프레임워크에서 자동 생성된 SQL에서도 이 문제가 종종 발생하므로 실행 전 반드시 확인이 필요합니다.
해결 방법
원인 1 해결: 다른 DBMS 타입을 Oracle 타입으로 변환
아래 표를 참고하여 타 DBMS 데이터 타입을 Oracle 타입으로 교체하세요.
| 타 DBMS 타입 | Oracle 대체 타입 |
|—|—|
| INT / INTEGER (MySQL) | NUMBER(10) 또는 INTEGER |
| TINYINT | NUMBER(3) |
| BIGINT | NUMBER(19) |
| DATETIME | DATE 또는 TIMESTAMP |
| BOOL / BOOLEAN | NUMBER(1) 또는 CHAR(1) |
| TEXT | CLOB |
| AUTO_INCREMENT | SEQUENCE + TRIGGER 또는 IDENTITY |
잘못된 예시 (MySQL 문법):
-- MySQL 문법 - Oracle에서 ORA-00902 발생
CREATE TABLE employees (
emp_id INT AUTO_INCREMENT,
emp_name VARCHAR(100),
is_active BOOL,
hire_date DATETIME,
salary FLOAT(10,2),
PRIMARY KEY (emp_id)
);
올바른 Oracle 문법으로 수정:
-- Oracle 문법으로 변환 - 정상 동작
CREATE TABLE employees (
emp_id NUMBER(10) GENERATED ALWAYS AS IDENTITY,
emp_name VARCHAR2(100) NOT NULL,
is_active NUMBER(1) DEFAULT 0 CHECK (is_active IN (0, 1)),
hire_date DATE,
salary NUMBER(10, 2),
PRIMARY KEY (emp_id)
);
원인 2 해결: 오타 및 잘못된 타입명 수정
Oracle에서 지원하는 정확한 데이터 타입명을 사용해야 합니다.
잘못된 예시 (오타 포함):
-- 오타로 인한 ORA-00902 발생
CREATE TABLE products (
prod_id NUMBR(10), -- NUMBER 오타
prod_name VARCAR2(200), -- VARCHAR2 오타
prod_desc CHARCTER(500), -- CHAR 오타
reg_date TIMESTMP -- TIMESTAMP 오타
);
올바른 Oracle 타입명으로 수정:
-- 정확한 Oracle 데이터 타입 사용
CREATE TABLE products (
prod_id NUMBER(10) NOT NULL,
prod_name VARCHAR2(200) NOT NULL,
prod_desc CHAR(500),
reg_date TIMESTAMP DEFAULT SYSTIMESTAMP,
PRIMARY KEY (prod_id)
);
Oracle에서 지원하는 주요 데이터 타입 목록:
-- Oracle 주요 데이터 타입 확인
SELECT TYPE_NAME
FROM DBA_TYPES
WHERE PREDEFINED = 'YES'
ORDER BY TYPE_NAME;
원인 3 해결: CAST 함수에서 올바른 타입 사용
잘못된 예시:
-- CAST에 잘못된 타입 사용 - ORA-00902 발생
SELECT emp_id,
CAST(salary AS INT), -- INT 사용 불가
CAST(hire_date AS DATETIME) -- DATETIME 사용 불가
FROM employees;
올바른 CAST 사용법:
-- Oracle CAST에서 올바른 타입 사용
SELECT emp_id,
CAST(salary AS NUMBER(10)), -- NUMBER 사용
CAST(hire_date AS TIMESTAMP), -- TIMESTAMP 사용
CAST(emp_name AS VARCHAR2(50)), -- VARCHAR2 사용
TO_NUMBER(salary), -- TO_NUMBER 함수 활용
TO_DATE(hire_date, 'YYYY-MM-DD') -- TO_DATE 함수 활용
FROM employees;
ALTER TABLE 에서의 타입 변경:
-- 컬럼 타입 변경 시 올바른 타입 사용
ALTER TABLE employees MODIFY (emp_name VARCHAR2(200));
ALTER TABLE employees ADD (dept_code CHAR(10));
ALTER TABLE employees ADD (updated_at TIMESTAMP DEFAULT SYSTIMESTAMP);
예방 방법
1. Oracle 공식 데이터 타입 체크리스트를 DDL 작성 전 반드시 참조하기
팀 내 DDL 작성 가이드라인을 수립하고, Oracle 공식 문서의 데이터 타입 목록을 표준 참조 문서로 지정하여 활용하세요. 특히 타 DBMS 경험이 있는 개발자가 Oracle DDL을 작성할 경우 반드시 크로스 체크를 수행해야 합니다. 아래 쿼리로 Oracle이 지원하는 내장 타입을 미리 확인해두면 실수를 줄일 수 있습니다.
-- Oracle 내장 데이터 타입 조회
SELECT TYPE_NAME, TYPECODE
FROM DBA_TYPES
WHERE PREDEFINED = 'YES'
AND OWNER = 'SYS'
ORDER BY TYPE_NAME;
2. 마이그레이션 시 자동 변환 스크립트 및 검증 프로세스 도입
타 DBMS에서 Oracle로 마이그레이션할 때는 반드시 DDL 변환 검증 단계를 프로세스에 포함시키세요. 변환된 DDL을 운영 적용 전에 개발/테스트 환경에서 먼저 실행하여 ORA-00902를 포함한 문법 에러를 사전에 제거해야 합니다. SQL Developer, AWS SCT(Schema Conversion Tool), Oracle SQL Developer Migration Workbench 같은 도구를 활용하면 자동으로 타입을 변환해주므로 적극 활용하는 것을 권장합니다.
관련 에러
- ORA-00904:
invalid identifier– 컬럼명이나 식별자가 유효하지 않을 때 발생하며, ORA-00902와 함께 DDL/DML 문법 오류 시 자주 동반 발생합니다. - ORA-00907:
missing right parenthesis– 데이터 타입에 괄호 문법이 잘못된 경우(예:NUMBER(10,2처럼 닫는 괄호 누락) 발생합니다. - ORA-00906:
missing left parenthesis– 타입 선언에서 필수 괄호가 누락된 경우 발생합니다. - ORA-01722:
invalid number– 런타임에서 숫자 변환이 실패할 때 발생하며, 잘못된 타입 변환과 관련된 에러입니다. - ORA-06502:
PL/SQL: numeric or value error– PL/SQL 내부에서 데이터 타입 불일치로 인해 발생하는 에러로, ORA-00902와 유사한 맥락에서 발생할 수 있습니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.