2026년 06월 15일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-00905 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-00905 missing keyword 는?
ORA-00905: missing keyword 에러는 Oracle SQL 구문에서 필수적으로 있어야 할 키워드가 누락되었을 때 발생하는 문법 오류입니다. Oracle 파서(Parser)가 SQL 문을 분석하는 과정에서 예상되는 키워드를 찾지 못할 때 이 에러를 반환하며, 주로 DML(INSERT, UPDATE, DELETE) 또는 DDL(CREATE, ALTER) 구문 작성 시 자주 발생합니다. 초보 개발자뿐만 아니라 숙련된 DBA도 복잡한 쿼리 작성 중에 실수로 마주칠 수 있는 에러이므로 정확한 원인 파악과 해결 방법을 숙지하는 것이 중요합니다.
주요 발생 원인
1. INSERT 구문에서 INTO 키워드 누락
INSERT 문을 작성할 때 INSERT 다음에 반드시 INTO 키워드가 와야 하는데, 이를 빠뜨리는 경우가 가장 흔한 원인입니다. 특히 다른 데이터베이스(MySQL 등)에서 Oracle로 마이그레이션하거나 타 DB 경험이 있는 개발자가 습관적으로 INTO를 생략하는 경우에 자주 발생합니다. Oracle은 이 키워드가 없으면 SQL 구조를 인식할 수 없어 즉시 ORA-00905 에러를 던집니다.
2. CREATE TABLE AS SELECT 구문의 오류
CTAS(Create Table As Select) 구문 사용 시 AS 키워드를 생략하거나 잘못된 위치에 다른 절을 삽입하는 경우에 에러가 발생합니다. 특히 CREATE TABLE ... SELECT ... 처럼 AS 없이 바로 SELECT를 연결하면 Oracle 파서는 예상한 키워드를 찾지 못해 ORA-00905를 반환합니다. 이 구문은 테이블 복사나 백업 용도로 실무에서 매우 빈번하게 쓰이므로 정확한 문법 숙지가 필요합니다.
3. UPDATE 문에서 SET 키워드 누락 또는 잘못된 JOIN 구문
UPDATE 문에서 SET 키워드를 빠뜨리거나, Oracle 고유의 UPDATE JOIN 문법을 따르지 않고 타 DB 스타일로 작성하는 경우에도 이 에러가 발생합니다. Oracle은 MySQL처럼 UPDATE t1 JOIN t2 ON ... 형식을 지원하지 않으며, 서브쿼리나 인라인 뷰를 사용하는 방식으로 작성해야 합니다. 이 차이를 모르고 타 DB 스타일의 UPDATE 쿼리를 그대로 Oracle에서 실행하면 반드시 에러가 발생합니다.
해결 방법
원인 1 해결: INSERT INTO 키워드 복원
잘못된 구문 (에러 발생):
-- ORA-00905 발생
INSERT employees (employee_id, first_name, last_name, hire_date)
VALUES (101, 'John', 'Doe', SYSDATE);
올바른 구문:
-- INTO 키워드 추가
INSERT INTO employees (employee_id, first_name, last_name, hire_date)
VALUES (101, 'John', 'Doe', SYSDATE);
원인 2 해결: CTAS(CREATE TABLE AS SELECT) 구문 수정
잘못된 구문 (에러 발생):
-- ORA-00905 발생 - AS 키워드 누락
CREATE TABLE employees_backup
SELECT * FROM employees WHERE department_id = 10;
올바른 구문:
-- AS 키워드 반드시 포함
CREATE TABLE employees_backup
AS
SELECT * FROM employees WHERE department_id = 10;
-- 특정 컬럼만 선택하여 백업 테이블 생성
CREATE TABLE emp_salary_backup
AS
SELECT employee_id, first_name, last_name, salary, hire_date
FROM employees
WHERE hire_date < TO_DATE('2020-01-01', 'YYYY-MM-DD');
원인 3 해결: UPDATE 구문의 SET 키워드 및 JOIN 방식 수정
잘못된 구문 (에러 발생):
-- ORA-00905 발생 - SET 키워드 누락
UPDATE employees
salary = salary * 1.1
WHERE department_id = 20;
올바른 구문:
-- SET 키워드 추가
UPDATE employees
SET salary = salary * 1.1
WHERE department_id = 20;
잘못된 JOIN UPDATE 구문 (MySQL 스타일):
-- ORA-00905 발생 - Oracle은 이 문법을 지원하지 않음
UPDATE employees e
JOIN departments d ON e.department_id = d.department_id
SET e.salary = e.salary * 1.05
WHERE d.department_name = 'IT';
올바른 Oracle JOIN UPDATE 구문:
-- 서브쿼리를 활용한 Oracle 방식
UPDATE employees e
SET e.salary = e.salary * 1.05
WHERE e.department_id = (
SELECT d.department_id
FROM departments d
WHERE d.department_name = 'IT'
);
-- 인라인 뷰를 활용한 방법 (다중 컬럼 업데이트 시 유용)
UPDATE (
SELECT e.salary, e.commission_pct
FROM employees e
JOIN departments d ON e.department_id = d.department_id
WHERE d.department_name = 'IT'
)
SET salary = salary * 1.05,
commission_pct = NVL(commission_pct, 0) + 0.01;
추가: MERGE 구문 오류 해결
실무에서 MERGE 문 사용 시에도 ORA-00905가 발생할 수 있습니다.
잘못된 구문:
-- WHEN MATCHED 절에서 THEN 키워드 누락
MERGE INTO employees e
USING emp_updates u ON (e.employee_id = u.employee_id)
WHEN MATCHED
UPDATE SET e.salary = u.new_salary
WHEN NOT MATCHED
INSERT (employee_id, first_name, salary)
VALUES (u.employee_id, u.first_name, u.new_salary);
올바른 구문:
-- THEN 키워드 반드시 포함
MERGE INTO employees e
USING emp_updates u ON (e.employee_id = u.employee_id)
WHEN MATCHED THEN
UPDATE SET e.salary = u.new_salary
WHEN NOT MATCHED THEN
INSERT (employee_id, first_name, salary)
VALUES (u.employee_id, u.first_name, u.new_salary);
예방 방법
1. SQL 코드 리뷰 도구 및 IDE 활용
SQL Developer, Toad, DBeaver 등의 IDE는 SQL 구문을 실시간으로 파싱하여 키워드 누락 등의 문법 오류를 실행 전에 시각적으로 알려줍니다. 특히 팀 단위로 개발할 때는 코드 리뷰 프로세스에 SQL Lint 도구(예: SQLFluff)를 CI/CD 파이프라인에 통합하면 배포 전에 이러한 문법 오류를 자동으로 잡아낼 수 있습니다. Oracle SQL Developer의 경우 F5(스크립트 실행) 이전에 Ctrl+Enter로 단일 구문을 먼저 검증하는 습관을 들이는 것을 강력히 권장합니다.
2. Oracle 전용 문법 레퍼런스 문서 상시 참조 및 팀 내 SQL 스타일 가이드 수립
다양한 DBMS를 혼용하는 개발 환경에서는 각 DBMS별 문법 차이로 인한 실수가 빈번합니다. 팀 내에서 Oracle 전용 SQL 작성 가이드(예: INSERT INTO 필수, UPDATE JOIN 방식, MERGE 구조 등)를 문서화하여 공유하고, 신규 입사자 온보딩 시 반드시 교육하는 프로세스를 만들면 ORA-00905와 같은 단순 문법 에러를 크게 줄일 수 있습니다. Oracle 공식 문서(docs.oracle.com)의 SQL Language Reference를 북마크하여 의심스러운 구문은 항상 공식 문서에서 확인하는 습관을 들이세요.
관련 에러
- ORA-00900: invalid SQL statement – SQL 문 자체가 Oracle에서 유효하지 않은 구조일 때 발생하며, ORA-00905와 함께 문법 오류 계열에 속합니다.
- ORA-00907: missing right parenthesis – 괄호 누락으로 발생하는 에러로, 복잡한 서브쿼리나 함수 작성 시 ORA-00905와 함께 자주 마주치는 에러입니다.
- ORA-00933: SQL command not properly ended – SQL 명령어가 올바르게 종료되지 않았을 때 발생하며, 불필요한 키워드가 추가되거나 구문 구조가 맞지 않을 때 ORA-00905와 유사한 상황에서 나타납니다.
- ORA-00936: missing expression – 표현식이 있어야 할 자리에 없을 때 발생하며, SELECT 절이나 WHERE 절의 불완전한 조건 작성 시 ORA-00905와 혼동될 수 있습니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.