DEV Community

umzzil nng
umzzil nng

Posted on • Originally published at oraerror.com

Oracle ORA-00936 Error: Causes and Solutions Complete Guide

ORA-00936: Missing Expression — Causes, Fixes & Prevention

ORA-00936 is one of the most common Oracle SQL syntax errors, occurring when the Oracle parser encounters a point in a SQL statement where an expression is required but nothing is found. This typically results from typos, copy-paste mistakes, or dynamic SQL generation bugs. Fortunately, it is almost always straightforward to diagnose and fix by carefully reviewing the SQL near the reported error position.


Top 3 Causes

1. Trailing Comma in the SELECT Clause

A stray comma after the last column in a SELECT list is the single most frequent trigger for this error.

-- BAD: trailing comma after last column
SELECT employee_id, first_name, last_name,
FROM employees
WHERE department_id = 10;

-- GOOD: remove the trailing comma
SELECT employee_id, first_name, last_name
FROM employees
WHERE department_id = 10;
Enter fullscreen mode Exit fullscreen mode

2. Incomplete WHERE Clause or IN List

When a comparison operator has nothing on its right-hand side, or an IN list is empty, Oracle raises ORA-00936.

-- BAD: missing value after '='
SELECT employee_id, salary
FROM employees
WHERE department_id =;

-- BAD: empty IN list
SELECT employee_id
FROM employees
WHERE department_id IN ();

-- GOOD: always provide a complete expression
SELECT employee_id, salary
FROM employees
WHERE department_id = 20;

SELECT employee_id
FROM employees
WHERE department_id IN (10, 20, 30);
Enter fullscreen mode Exit fullscreen mode

3. Missing Value in INSERT VALUES or UPDATE SET

Omitting a value in a VALUES clause or leaving a SET assignment incomplete will trigger this error immediately.

-- BAD: missing last_name value in INSERT
INSERT INTO employees (employee_id, first_name, last_name, hire_date)
VALUES (300, 'John', , SYSDATE);

-- BAD: no value assigned in UPDATE
UPDATE employees
SET salary =
WHERE employee_id = 300;

-- GOOD: complete all expressions
INSERT INTO employees (employee_id, first_name, last_name, hire_date)
VALUES (300, 'John', 'Doe', SYSDATE);

UPDATE employees
SET salary = 6000
WHERE employee_id = 300;
Enter fullscreen mode Exit fullscreen mode

Quick Fix Solutions

  1. Read the full error message — Oracle usually reports the line and column number where parsing failed. Go directly to that position in your SQL.
  2. Check every comma — Scan your SELECT list and VALUES list for trailing or double commas.
  3. Validate every operator — Make sure every =, >, LIKE, IN, etc. has a valid expression on both sides.
  4. Print dynamic SQL before execution — If your application builds SQL at runtime, log the final string and test it in SQL Developer or SQL*Plus manually.
-- Safe dynamic SQL pattern using bind variables
SELECT employee_id, first_name, salary
FROM employees
WHERE 1 = 1
  AND department_id = :dept_id
  AND salary       > :min_salary;
Enter fullscreen mode Exit fullscreen mode

Prevention Tips

  • Use bind variables instead of string concatenation. Bind variables prevent incomplete expressions caused by missing parameter values and also protect against SQL injection.
  • Adopt a SQL-aware IDE. Tools like SQL Developer, Toad, or DBeaver highlight syntax errors before you run the query, catching ORA-00936 issues at development time rather than in production.

Related Oracle Errors

Error Code Description
ORA-00907 Missing right parenthesis
ORA-00904 Invalid identifier
ORA-00917 Missing comma
ORA-00933 SQL command not properly ended

These errors often appear alongside ORA-00936 during SQL syntax troubleshooting and should be checked together when diagnosing malformed queries.


📖 Want a more detailed guide?
Check out the full in-depth version (Korean) on oraerror.com — includes detailed analysis, additional SQL examples, and prevention tips.

Top comments (0)