2026년 06월 18일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-00922 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-00922 missing or invalid option 는?
ORA-00922 에러는 Oracle SQL 또는 DDL(Data Definition Language) 문장에서 잘못된 옵션이나 키워드를 사용했을 때 발생하는 구문 오류입니다. 주로 CREATE, ALTER, DROP 등의 DDL 문장을 작성할 때 허용되지 않는 옵션이나 오타가 포함된 경우 Oracle 파서가 이 에러를 반환합니다. 이 에러는 문법적 오류이기 때문에 실행 자체가 불가능하며, SQL 문장을 수정해야만 해결할 수 있습니다.
주요 발생 원인
1. 데이터 타입 선언 오류 또는 잘못된 컬럼 옵션 사용
가장 흔한 원인 중 하나로, CREATE TABLE 문에서 컬럼의 데이터 타입이나 제약 조건을 잘못 기술하는 경우입니다. 예를 들어 VARCHAR 대신 VARCHAR2를 사용해야 하는 Oracle 환경에서 잘못된 타입 명칭을 쓰거나, NOT NULL과 같은 제약 조건 키워드를 잘못된 위치에 배치했을 때 발생합니다. Oracle은 ANSI SQL과 문법이 미묘하게 다르기 때문에 타 DBMS에서 가져온 스크립트를 그대로 실행하면 이 에러가 자주 발생합니다.
2. 객체 이름 또는 예약어 충돌
테이블명, 컬럼명, 인덱스명 등에 Oracle 예약어를 그대로 사용하거나 특수 문자가 포함된 경우 파서가 이를 옵션 키워드로 잘못 해석하여 ORA-00922가 발생할 수 있습니다. 예를 들어 DATE, NUMBER, TABLE, SELECT 같은 예약어를 컬럼명으로 사용하면 Oracle은 이를 SQL 문법의 일부로 인식하여 파싱 오류를 일으킵니다. 객체 이름에 공백이나 특수문자가 포함되어 있는데 큰따옴표로 감싸지 않은 경우에도 동일한 에러가 발생합니다.
3. Storage, Tablespace 등 물리적 속성 옵션의 잘못된 기술
CREATE TABLE 또는 CREATE INDEX 문에서 STORAGE 절, TABLESPACE 절, PCTFREE, PCTUSED 등의 물리적 옵션을 잘못된 순서 또는 잘못된 구문으로 기술한 경우 ORA-00922가 발생합니다. 특히 Oracle 버전마다 지원되는 옵션이 다를 수 있으므로, 이전 버전에서 작성된 스크립트를 최신 버전에서 실행하거나 그 반대의 경우에도 이 에러가 나타날 수 있습니다. 옵션의 순서가 바뀌거나 불필요한 쉼표, 괄호가 포함된 경우에도 동일 에러가 발생합니다.
해결 방법
원인 1 해결: 데이터 타입 및 컬럼 옵션 수정
잘못된 구문 예시:
-- 오류 발생: VARCHAR는 Oracle에서 권장하지 않으며, 옵션 위치 오류
CREATE TABLE emp_test (
emp_id NUMBER NOT NULL PRIMARY,
emp_name VARCHAR(100),
hire_date DATE NOT NULL DEFAULT SYSDATE
);
올바른 구문으로 수정:
-- 수정된 구문
CREATE TABLE emp_test (
emp_id NUMBER NOT NULL,
emp_name VARCHAR2(100) NOT NULL,
hire_date DATE DEFAULT SYSDATE NOT NULL,
CONSTRAINT pk_emp_test PRIMARY KEY (emp_id)
);
> 핵심 포인트: Oracle에서는 VARCHAR2를 사용하고, DEFAULT절은 반드시 NOT NULL 앞에 위치해야 합니다.
원인 2 해결: 예약어 충돌 해결
잘못된 구문 예시:
-- 오류 발생: DATE, NUMBER가 예약어이므로 컬럼명으로 사용 불가
CREATE TABLE order_info (
number NUMBER(10),
date DATE,
comment VARCHAR2(200)
);
올바른 구문으로 수정 (큰따옴표 사용 또는 이름 변경):
-- 방법 1: 컬럼명을 예약어가 아닌 이름으로 변경 (권장)
CREATE TABLE order_info (
order_no NUMBER(10),
order_date DATE,
order_comment VARCHAR2(200)
);
-- 방법 2: 큰따옴표로 감싸기 (권장하지 않음 - 대소문자 구분 발생)
CREATE TABLE order_info (
"number" NUMBER(10),
"date" DATE,
"comment" VARCHAR2(200)
);
> 주의: 큰따옴표를 사용하면 이후 모든 DML에서도 동일하게 큰따옴표를 사용해야 하므로 가능한 예약어를 피한 이름 사용을 권장합니다.
원인 3 해결: Storage 및 물리적 옵션 수정
잘못된 구문 예시:
-- 오류 발생: STORAGE 옵션 구문 오류
CREATE TABLE sales_data (
sale_id NUMBER(10),
sale_amt NUMBER(15,2)
)
STORAGE INITIAL 1M NEXT 1M MAXEXTENTS UNLIMITED
TABLESPACE users;
올바른 구문으로 수정:
-- 수정된 구문: STORAGE 절 괄호 및 키워드 순서 정확히 기술
CREATE TABLE sales_data (
sale_id NUMBER(10),
sale_amt NUMBER(15,2)
)
TABLESPACE users
STORAGE (
INITIAL 1M
NEXT 1M
MAXEXTENTS UNLIMITED
PCTINCREASE 0
);
실제 에러 발생 여부를 사전에 확인하는 방법:
-- DBMS_METADATA를 이용해 기존 객체의 DDL 확인 후 참고
SELECT DBMS_METADATA.GET_DDL('TABLE', 'SALES_DATA', USER)
FROM DUAL;
예방 방법
1. SQL 코드 작성 전 Oracle 공식 문법 레퍼런스 확인 및 SQL Developer 활용
Oracle SQL Developer나 SQLcl을 활용하면 DDL 작성 시 실시간으로 문법 오류를 강조 표시해 주기 때문에 ORA-00922와 같은 구문 오류를 사전에 방지할 수 있습니다. 또한 팀 내에서 공통으로 사용하는 DDL 템플릿을 사전에 정의하고, 검증된 템플릿만 사용하는 규칙을 수립하면 실수를 크게 줄일 수 있습니다. 특히 타 DBMS(MySQL, PostgreSQL 등)에서 마이그레이션하는 스크립트는 반드시 Oracle 문법에 맞게 변환 검토를 거쳐야 합니다.
2. 객체 명명 규칙(Naming Convention) 수립 및 예약어 목록 관리
프로젝트 초기에 Oracle 예약어 목록을 참고하여 컬럼명, 테이블명, 인덱스명 등에 대한 명명 규칙을 명확히 정의하고 문서화해야 합니다. 예약어 충돌을 원천 차단하기 위해 테이블명에는 T_, 컬럼명에는 업무 도메인 약어를 접두어로 사용하는 등의 규칙을 적용하면 ORA-00922를 비롯한 다양한 구문 에러를 예방할 수 있습니다. 아래 쿼리로 Oracle 예약어 목록을 조회하여 프로젝트에서 사용하는 명칭과 비교할 수 있습니다.
-- Oracle 예약어 목록 조회
SELECT keyword, reserved
FROM v$reserved_words
WHERE reserved = 'Y'
ORDER BY keyword;
관련 에러
- ORA-00900:
invalid SQL statement— SQL 문장 자체가 Oracle에서 인식되지 않는 경우 발생하며, ORA-00922와 함께 구문 오류 계열의 대표적인 에러입니다. - ORA-00904:
invalid identifier— 존재하지 않거나 잘못된 컬럼명, 객체명을 참조할 때 발생하며, 예약어를 잘못 사용한 경우에도 ORA-00904와 ORA-00922가 함께 나타날 수 있습니다. - ORA-00907:
missing right parenthesis— 괄호 누락으로 인한 구문 오류로, CREATE TABLE이나 STORAGE 절 작성 시 ORA-00922와 유사한 상황에서 발생합니다. - ORA-00911:
invalid character— SQL 문장 내에 허용되지 않는 특수문자가 포함된 경우 발생하며, 객체 명명 오류와 연관이 깊습니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.