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

ORA-00936
2026년 06월 20일 | DBMS Error 가이드

이 글에서 다루는 내용

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

ORA-00936 missing expression 는?

ORA-00936 에러는 Oracle SQL 문장을 파싱하는 과정에서 필수적으로 있어야 할 표현식(Expression)이 누락되었을 때 발생하는 문법 오류입니다. 주로 SELECT, INSERT, UPDATE, DELETE 등의 DML 문장에서 컬럼명, 값, 연산자 등이 빠졌을 때 Oracle 파서가 이를 감지하여 발생시킵니다. 이 에러는 쿼리 작성 실수에서 비롯되는 경우가 대부분이므로, 에러 발생 위치를 중심으로 SQL 문법을 꼼꼼히 점검하면 대부분 해결할 수 있습니다.


주요 발생 원인

1. SELECT 절에서 컬럼명 또는 표현식 누락

가장 흔하게 발생하는 원인으로, SELECT 절에 콤마(,)를 입력한 후 뒤따라오는 컬럼명이나 표현식을 빠뜨렸을 때 발생합니다. 예를 들어 SELECT col1, FROM table1과 같이 마지막 컬럼 뒤에 불필요한 콤마가 남아 있거나, 의도한 컬럼명 자체를 누락한 경우가 대표적입니다. 이 상황은 다수의 컬럼을 복사·붙여넣기 방식으로 편집할 때 특히 자주 발생합니다.

2. WHERE 절 또는 조건식에서 비교 대상값 누락

WHERE 절에서 비교 연산자(=, >, <, LIKE 등) 뒤에 오는 값이나 컬럼이 빠진 경우 이 에러가 발생합니다. 예를 들어 WHERE department_id = 처럼 비교 연산자 오른쪽에 아무것도 없거나, IN 절에서 괄호 안의 값 목록이 비어있는 경우가 해당됩니다. 복잡한 동적 SQL을 생성하는 애플리케이션에서 파라미터 바인딩 로직의 오류로 인해 이런 상황이 발생하기도 합니다.

3. INSERT 또는 UPDATE 문에서 VALUES 절 표현식 누락

INSERT 문의 VALUES 절이나 UPDATE 문의 SET 절에서 값(Value)에 해당하는 표현식이 빠졌을 때 발생합니다. 예를 들어 INSERT INTO emp (empno, ename) VALUES (7001,) 처럼 특정 값이 누락되거나, UPDATE emp SET sal = 처럼 SET 절에 할당 값이 없는 경우가 해당됩니다. 여러 컬럼을 동시에 처리하는 배치 스크립트에서 로직 오류로 인해 값이 생성되지 않을 때도 동일한 에러가 나타납니다.


해결 방법

원인 1 해결: SELECT 절 콤마 및 표현식 확인

잘못된 SQL:

-- 마지막 컬럼 뒤에 불필요한 콤마가 있는 경우
SELECT employee_id, first_name, last_name,
FROM employees
WHERE department_id = 10;

수정된 SQL:

-- 불필요한 콤마를 제거
SELECT employee_id, first_name, last_name
FROM employees
WHERE department_id = 10;

또 다른 잘못된 예시 (중간 컬럼 누락):

-- 콤마 사이에 컬럼명이 없는 경우
SELECT employee_id, , last_name
FROM employees;

수정된 SQL:

-- 누락된 컬럼명을 올바르게 입력
SELECT employee_id, first_name, last_name
FROM employees;

원인 2 해결: WHERE 절 조건 완성

잘못된 SQL:

-- 비교 연산자 오른쪽 값이 없는 경우
SELECT employee_id, salary
FROM employees
WHERE department_id =;

수정된 SQL:

-- 비교 대상 값을 명시
SELECT employee_id, salary
FROM employees
WHERE department_id = 20;

IN 절에서의 잘못된 예시:

-- IN 절 내부가 비어있는 경우
SELECT employee_id, first_name
FROM employees
WHERE department_id IN ();

수정된 SQL:

-- IN 절에 유효한 값 목록 제공
SELECT employee_id, first_name
FROM employees
WHERE department_id IN (10, 20, 30);

동적 SQL에서 파라미터가 누락되는 상황 예방 패턴:

-- 동적 SQL 생성 시 조건이 없을 경우를 대비해 1=1 패턴 활용
SELECT employee_id, first_name, salary
FROM employees
WHERE 1 = 1
  AND department_id = :dept_id   -- 바인드 변수 사용
  AND salary > :min_salary;

원인 3 해결: INSERT / UPDATE 문 값 표현식 완성

잘못된 INSERT:

-- VALUES 절에서 특정 값이 누락된 경우
INSERT INTO employees (employee_id, first_name, last_name, hire_date)
VALUES (300, 'Gildong', , SYSDATE);

수정된 SQL:

-- 누락된 값을 올바르게 입력
INSERT INTO employees (employee_id, first_name, last_name, hire_date)
VALUES (300, 'Gildong', 'Hong', SYSDATE);

잘못된 UPDATE:

-- SET 절에 할당값이 없는 경우
UPDATE employees
SET salary =
WHERE employee_id = 300;

수정된 SQL:

-- 올바른 값을 할당
UPDATE employees
SET salary = 5000
WHERE employee_id = 300;

서브쿼리를 활용한 UPDATE 예시:

-- 서브쿼리를 통해 값을 설정하는 경우도 표현식이 완전해야 함
UPDATE employees e
SET e.salary = (
    SELECT AVG(salary) * 1.1
    FROM employees
    WHERE department_id = e.department_id
)
WHERE e.department_id = 20;

예방 방법

1. SQL 정적 분석 도구 및 IDE 활용

SQL Developer, Toad, DBeaver 등 SQL IDE를 사용하면 쿼리를 실행하기 전에 문법 오류를 시각적으로 강조 표시해 줍니다. 특히 팀 단위 개발 환경에서는 SonarQube의 SQL 플러그인이나 사내 코드 리뷰 프로세스에 SQL Lint 도구를 통합하여 배포 전 단계에서 문법 오류를 사전 차단하는 것이 Best Practice입니다. 동적 SQL을 생성하는 애플리케이션 코드에서는 최종 생성된 SQL 문자열을 로그로 출력하여 검증하는 습관을 들이는 것이 중요합니다.

2. 바인드 변수(Bind Variable) 및 ORM 사용 습관화

하드코딩된 값을 SQL 문자열에 직접 연결(Concatenation)하는 방식 대신, :변수명 형태의 바인드 변수나 PreparedStatement를 활용하면 표현식 누락으로 인한 ORA-00936 에러를 원천적으로 줄일 수 있습니다. MyBatis, Hibernate 등의 ORM 프레임워크를 사용할 경우에도 동적 SQL 조건 처리 시 , 태그 등을 올바르게 사용하여 조건절이 항상 완전한 표현식을 갖도록 보장해야 합니다. 바인드 변수를 사용하면 SQL 인젝션 방지와 파싱 성능 향상이라는 추가적인 이점도 얻을 수 있습니다.


관련 에러

  • ORA-00907: missing right parenthesis — 괄호가 닫히지 않아 발생하며, ORA-00936과 유사하게 SQL 문법 오류에서 비롯됩니다.
  • ORA-00904: invalid identifier — 존재하지 않는 컬럼명이나 잘못된 식별자를 사용했을 때 발생하며, 컬럼 이름 오타 시 ORA-00936 대신 이 에러가 나타날 수 있습니다.
  • ORA-00917: missing comma — SELECT 절이나 VALUES 절에서 콤마가 누락되었을 때 발생하며, ORA-00936과 함께 문법 오류 트러블슈팅 시 함께 확인해야 할 에러입니다.
  • ORA-00933: SQL command not properly ended — SQL 문장의 끝이 올바르지 않을 때 발생하며, 불완전한 서브쿼리나 절(Clause) 구성 오류 시 ORA-00936과 혼동되기도 합니다.

DBMS 에러 코드 시리즈

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

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

댓글 남기기