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 error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.