
اگر با Oracle Database کار کرده باشی، تقریباً محاله حداقل یکبار با خطای زیر روبهرو نشده باشی:
ORA-00936: missing expression
خطایی که معمولاً وسط کار، آن هم دقیقاً زمانی که فکر میکنی کوئریات بینقص است، ظاهر میشود!
در این مقاله آموزش Oracle در بخش خطای های اوراکلی، این خطا را کاملاً ریشهای، با مثالهای واقعی و کاربردی بررسی میکنیم؛ طوری که بعد از خواندنش، نهتنها دلیل خطا را بفهمی، بلکه دیگر بهراحتی اسیرش نشوی.
ORA‑۰۱۴۰۰: cannot insert NULL into ("SCHEMA"."TABLE"."COLUMN")
این خطا معمولاً دقیقاً زمانی ظاهر میشود که فکر میکنی Query کاملاً منطقی است. ستون را خودت دیدهای، اسمش درست است، جدول وجود دارد… اما اوراکل نظر دیگری دارد.
پیشنهاد می کنم این مقاله زیر رو حتما مطالعه کنی.
در این مقاله شما می خوانید
خطای ORA‑۰۰۹۳۶: Missing Expression یعنی:
«اوراکل انتظار یک Expression معتبر دارد، اما چیزی پیدا نمیکند.»
Expression چیست؟
در Oracle، Expression میتواند یکی از اینها باشد:
- نام ستون
- مقدار ثابت (عدد، رشته، تاریخ)
- تابع (NVL، TO_DATE، SUM و …)
- شرط (Condition)
- Subquery
- یا ترکیبی از موارد بالا
به زبان سادهتر:
📌 جایی از کوئری، چیزی جا افتاده یا ناقص نوشته شده است.
چون:
- Oracle به سینتکس خیلی حساس است
- بعضی خطاها با یک کامای اضافه یا یک شرط ناقص رخ میدهند
- در کوئریهای UPDATE، JOIN و CASE WHEN خیلی زود اتفاق میافتد
WHERE بدون شرط
❌ غلط
SELECT * FROM employees
WHERE;
✅ درست
SELECT * FROM employees
WHERE department_id = 10;
📌 بعد از WHERE حتماً باید شرط بیاید.
AND / OR ناقص
❌ غلط
SELECT * FROM employees
WHERE department_id = 10 AND;
✅ درست
SELECT * FROM employees
WHERE department_id = 10
AND salary > ۵۰۰۰;
📌 AND یا OR بدون شرط بعدش = Missing Expression
کامای اضافی در SELECT
❌ غلط
SELECT employee_id, , salary
FROM employees;
✅ درست
SELECT employee_id, salary
FROM employees;
📌 یک کامای اضافی، کل کوئری را میترکاند!
IN با پرانتز خالی
❌ غلط
SELECT * FROM employees
WHERE department_id IN ();
✅ درست
SELECT * FROM employees
WHERE department_id IN (10, 20, 30);
یا:
WHERE department_id IN (
SELECT department_id FROM departments
);
UPDATE با SET ناقص
❌ غلط
UPDATE employees
SET salary =
WHERE employee_id = 100;
✅ درست
UPDATE employees
SET salary = 8000
WHERE employee_id = 100;
📌 بعد از = باید مقدار یا Expression باشد.
CASE WHEN ناقص
❌ غلط
UPDATE employees
SET salary = CASE
WHEN department_id = 10 THEN
WHEN department_id = 20 THEN salary * 1.1
END;
✅ درست
UPDATE employees
SET salary = CASE
WHEN department_id = 10 THEN salary * 1.2
WHEN department_id = 20 THEN salary * 1.1
ELSE salary
END;
📌 هر THEN باید خروجی داشته باشد.
استفاده ناقص از توابع Oracle
❌ غلط
SELECT NVL(salary)
FROM employees;
✅ درست
SELECT NVL(salary, 0)
FROM employees;
ORDER BY ناقص
❌ غلط
SELECT * FROM employees
ORDER BY;
✅ درست
SELECT * FROM employees
ORDER BY salary DESC;
خطا در JOIN
❌ غلط
SELECT e.employee_id, d.department_name
FROM employees e
JOIN departments d
ON e.department_id = ;
✅ درست
SELECT e.employee_id, d.department_name
FROM employees e
JOIN departments d
ON e.department_id = d.department_id;
✅ چکلیست طلایی
قبل از اجرا این موارد را سریع چک کن:
- [ ] بعد از WHERE شرط هست؟
- [ ] AND / OR تنها نیست؟
- [ ] بعد از = مقدار داریم؟
- [ ] IN خالی نیست؟
- [ ] CASE WHEN کامل است؟
- [ ] کامای اضافه نداریم؟
- [ ] پرانتزها درست بسته شدهاند؟
سوالات متداول درباره رفع خطای ORA‑۰۰۹۳۶ در اوراکل
خطای ORA‑۰۰۹۳۶ یعنی Oracle انتظار یک Expression معتبر دارد، اما بهدلیل ناقص بودن کوئری، چیزی دریافت نمیکند.
این خطا معمولاً وقتی رخ میدهد که:
- بعد از
WHEREشرطی نوشته نشده ANDیاORبدون شرط استفاده شدهSETدر UPDATE مقدار نداردCASE WHENناقص نوشته شده- یا
IN ()خالی است
📌 به زبان ساده: یک تکه از کوئری جا افتاده است.
- ORA‑۰۰۹۳۶ → Expression وجود ندارد
- ORA‑۰۰۹۳۳ → ساختار کلی SQL اشتباه است
کوئری را خطبهخط اجرا کن و بخش WHERE و SET را بررسی کن.
❌ نه، کاملاً Syntax Error است.
جمعبندی
خطای ORA‑۰۰۹۳۶ تقریباً همیشه یعنی:
«یک تکه از کوئریات ناقص است»
با کمی دقت روی:
- WHERE
- AND / OR
- SET
- CASE WHEN
- IN
میتوانی ۹۰٪ مواقع آن را در چند ثانیه حل کنی.
📥 اگر سوالی داری در مورد رفع خطای ORA‑۰۰۹۳۶ در اوراکل داری، در بخش کامنتها بپرس.
سؤالی درباره این مقاله داری؟
اگر نکتهای در این مقاله برات مبهم بود یا خواستی بیشتر بدونی، همین حالا برام بنویس تا دقیق و صمیمی پاسخت رو بدم — مثل یه گفتوگوی واقعی 💬
برو به صفحه پرسش و پاسخ
دیدگاهتان را بنویسید