ESC را فشار دهید تا بسته شود

زمیوس آموزش، یادگیری و سرگرمی

ORA‑۰۰۹۰۴ چیست و چرا یکی از اعصاب‌خردکن‌ترین خطاهای Oracle است؟

روایت واقعی یک روز کاری با Oracle Database و خطای Invalid Identifier

هر کسی که با Oracle Database کار کرده باشد، دیر یا زود با خطایی روبه‌رو می‌شود که ظاهرش ساده است، اما پشتش کلی دردسر خوابیده:

				
					ORA‑۰۰۹۰۴: invalid identifier
				
			

این خطا معمولاً دقیقاً زمانی ظاهر می‌شود که فکر می‌کنی Query کاملاً منطقی است. ستون را خودت دیده‌ای، اسمش درست است، جدول وجود دارد… اما اوراکل نظر دیگری دارد.

اینجا همان نقطه‌ای است که داستان ORA‑۰۰۹۰۴ شروع می‌شود؛ داستانی که تقریباً برای همه‌ی برنامه‌نویس‌ها و DBAها آشناست.

در ادامه آموزش Oracle در بخش آموزش خطاهای اوراکلی همه چیز را توضیح می‌دهم، با مثال‌های واقعی، تا همیشه بتوانی بفهمی مشکل از کجاست و چطور از تکرارش جلوگیری کنی.

خطای ORA‑۰۰۰۶۰: Deadlock Detected یکی از خطاهای مهم در Oracle Database است که معمولاً به‌طرز ناگهانی در سیستم‌های پایدار ظاهر می‌شود و باعث توقف بخشی از عملیات برنامه می‌گردد.

پیشنهاد می کنم این مقاله زیر رو حتما مطالعه کنی.

ORA‑۰۰۹۰۴ در Oracle به چه معناست؟

به زبان ساده و انسانی، Oracle با این خطا می‌گوید:

«چیزی که در Query نوشتی، من نمی‌شناسمش.»

از نظر فنی، خطای ORA‑۰۰۹۰۴: invalid identifier زمانی رخ می‌دهد که Oracle نتواند یکی از موارد زیر را تشخیص دهد:

  • نام ستون (Column Name)
  • alias تعریف‌شده در Query
  • نام جدول یا View
  • expression یا شناسه‌ای که در جای نادرست استفاده شده

این خطا یکی از رایج‌ترین خطاهای Oracle SQL است و تقریباً همیشه به اشتباه انسانی برمی‌گردد، نه مشکل دیتابیس.

شروع ماجرا: ستونی که «به نظر» وجود داشت

یک Query ساده برای استخراج اطلاعات کارمندان نوشته می‌شود:

				
					SELECT emp_id, full_name, salary
FROM employees
WHERE department_name = 'IT';

				
			

در نگاه اول، کاملاً منطقی به نظر می‌رسد. اما Oracle بلافاصله پاسخ می‌دهد:

				
					ORA-00904: "DEPARTMENT_NAME": invalid identifier

				
			

اینجا اولین شوک وارد می‌شود. بررسی ساختار جدول حقیقت را روشن می‌کند:

				
					DESC employees;

				
			

خروجی:

				
					EMP_ID
FIRST_NAME
LAST_NAME
SALARY
DEPARTMENT_ID
				
			

ستونی به نام department_name اصلاً در این جدول وجود ندارد.

علت خطا

یکی از شایع‌ترین دلایل ORA‑۰۰۹۰۴:

استفاده از ستونی که در جدول وجود ندارد.

راه‌حل اصولی: نوشتن Query درست، نه حدس‌زدن

نام دپارتمان در جدول دیگری ذخیره شده بود. بنابراین باید Join استفاده شود:

				
					SELECT e.emp_id,
       e.first_name || ' ' || e.last_name AS full_name,
       e.salary
FROM employees e
JOIN departments d ON d.department_id = e.department_id
WHERE d.department_name = 'IT';

				
			

نتیجه:

  • خطا از بین می‌رود
  • Query خوانا و استاندارد می‌شود
  • مشکل ریشه‌ای حل می‌شود، نه موقتی

ORA‑۰۰۹۰۴ و دام خطرناک Aliasها

یکی دیگر از سناریوهای بسیار رایج خطای ORA‑۰۰۹۰۴، استفاده‌ی نادرست از alias است:

				
					SELECT salary * 12 AS yearly_salary
FROM employees
WHERE yearly_salary > ۱۰۰۰۰۰;

				
			

و دوباره پیام آشنا:

				
					ORA-00904: "YEARLY_SALARY": invalid identifier

				
			

چرا این اتفاق می‌افتد؟

در Oracle ترتیب اجرای Query به این شکل است:

  1. FROM
  2. WHERE
  3. SELECT

یعنی زمانی که بخش WHERE اجرا می‌شود، alias هنوز ساخته نشده است.

روش‌های صحیح برای رفع این نوع ORA‑۰۰۹۰۴

روش اول: تکرار expression

				
					SELECT salary * 12 AS yearly_salary
FROM employees
WHERE salary * 12 > ۱۰۰۰۰۰;

				
			

روش دوم (تمیزتر و حرفه‌ای‌تر): Subquery

				
					SELECT *
FROM (
    SELECT salary * 12 AS yearly_salary
    FROM employees
)
WHERE yearly_salary > ۱۰۰۰۰۰;

				
			

این روش مخصوصاً در Queryهای پیچیده توصیه می‌شود.

وقتی ORA‑۰۰۹۰۴ از حروف کوچک و بزرگ شروع می‌شود

یکی از خطرناک‌ترین و اعصاب‌خردکن‌ترین حالت‌ها زمانی است که double quote وارد بازی می‌شود:

				
					CREATE TABLE users (
  "UserName" VARCHAR2(50)
);

				
			

و بعد:

				
					SELECT username FROM users;

				
			

نتیجه:

				
					ORA-00904: "USERNAME": invalid identifier

				
			

چرا؟

زمانی که از double quote استفاده می‌شود:

  • Oracle به حروف بزرگ و کوچک حساس می‌شود
  • UserName با USERNAME یا username فرق دارد

تنها Query درست:

				
					SELECT "UserName" FROM users;

				
			

📌 تجربه عملی نشان داده:

استفاده نادرست از double quote یکی از سریع‌ترین راه‌ها برای رسیدن به ORA‑۰۰۹۰۴ است.

چرا ORA‑۰۰۹۰۴ این‌قدر زیاد رخ می‌دهد؟

چون معمولاً در شرایطی اتفاق می‌افتد که:

  • Query «از نظر منطقی» درست به نظر می‌رسد
  • خطا واضح نیست
  • Oracle پیام خطای کوتاه و خشک می‌دهد

اما واقعیت این است که ORA‑۰۰۹۰۴ تقریباً همیشه به یکی از این موارد برمی‌گردد:

  • ستون اشتباه یا حذف شده
  • استفاده نادرست از alias
  • Join ناقص یا اشتباه
  • حساسیت به حروف بزرگ و کوچک
  • درک نکردن ترتیب اجرای Query در Oracle

چک‌لیست نجات قبل از درگیری جدی با ORA‑۰۰۹۰۴ در اوراکل

قبل از عصبی شدن:

  • از DESC table_name استفاده کن
  • دقیقاً نام ستون‌ها را بررسی کن
  • alias را در WHERE استفاده نکن
  • Joinها را دوباره مرور کن
  • تا حد امکان از double quote استفاده نکن

سوالات متداول درباره رفع خطای ORA‑۰۰۹۰۴ در اوراکل

خطای ORA‑۰۰۹۰۴: invalid identifier یعنی یکی از شناسه‌هایی (identifier) که در Query نوشته شده — مثل نام ستون، alias، جدول یا متغیر — برای Oracle ناشناخته است.

به‌عبارت ساده‌تر، Oracle نمی‌تواند تشخیص دهد چیزی به نامی که نوشته‌ای وجود دارد یا نه.

این مشکل معمولاً زمانی اتفاق می‌افتد که:

  • اسم ستون اشتباه نوشته شده باشد.
  • ستون در جدول وجود نداشته باشد.
  • alias در بخش WHERE استفاده شده باشد.
  • یا از quotation اشتباه استفاده شده باشد.

🔍 راه‌حل سریع: با دستور DESC table_name ساختار جدول را بررسی کن و مطمئن شو نام دقیق ستون را در Query نوشته‌ای.

در Oracle، ترتیب اجرای Query باعث می‌شود که WHERE قبل از SELECT اجرا شود.

این یعنی وقتی Oracle به بخش WHERE می‌رسد، هنوز aliasها (نام‌های مستعار تعریف‌شده در SELECT) ساخته نشده‌اند. در نتیجه، استفاده از alias در WHERE منجر به خطای ORA‑۰۰۹۰۴ می‌شود.

✅ راه‌حل:

دو روش استاندارد وجود دارد:

  1. مستقیماً از expression استفاده کن.
   SELECT salary * ۱۲ AS yearly_salary
   FROM employees
   WHERE salary * ۱۲ > ۱۰۰۰۰۰;
  1. از Subquery استفاده کن تا alias در لایه‌ی بیرونی شناخته شود.
   SELECT *
   FROM (
       SELECT salary * ۱۲ AS yearly_salary
       FROM employees
   )
   WHERE yearly_salary > ۱۰۰۰۰۰;

بله، در بسیاری از موارد همین موضوع علت اصلی خطای ORA‑۰۰۹۰۴ است.

در Oracle، اگر هنگام ایجاد جدول از double quote (” “) استفاده شود، نام ستون case-sensitive می‌شود. یعنی UserName، USERNAME و username سه نام متفاوت هستند.

مثلاً:

CREATE TABLE users ("UserName" VARCHAR2(۵۰));

در این حالت، تنها راه دسترسی به ستون:

SELECT "UserName" FROM users;

اگر بدون quote بنویسی:

SELECT username FROM users;

اوراکل بلافاصله خطای ORA‑۰۰۹۰۴ می‌دهد.

⚠️ نکته: تا زمانی که لازم نیست، از double quote در نام اشیاء Oracle استفاده نکن.

برای رفع سریع این خطا باید مرحله‌به‌مرحله بررسی کنی:

  1. اجرای دستور DESC table_name برای دیدن ستون‌ها.
  2. بررسی نام‌های ستون و دقت به حروف کوچک و بزرگ.
  3. اطمینان از اینکه ستون در جدول مربوطه وجود دارد.
  4. حذف alias از WHERE و استفاده از خود expression.
  5. بررسی Join‌ها (ممکن است فیلد مربوط به Join در جدول اشتباه نوشته شده باشد).

اگر بعد از همه‌ی این مراحل هنوز خطا باقی ماند، Query را با alias واضح‌تر بازنویسی کن و از SQL Developer یا TOAD برای مشاهده‌ی ساختار واقعی جداول استفاده کن.

خطای ORA‑۰۰۹۰۴: invalid identifier یکی از رایج‌ترین خطاهای Oracle است، اما خوشبختانه یکی از قابل‌حل‌ترین‌ها هم هست.

اگر ساختار جدول را درست بشناسی، ترتیب اجرای Query را درک کنی و با alias و double quote محتاط باشی، این خطا خیلی زود برایت قابل تشخیص می‌شود.

📥 اگر سوالی داری در مورد رفع خطای ORA‑۰۰۹۰۴ در اوراکل داری، در بخش کامنت‌ها بپرس.

سؤالی درباره این مقاله داری؟

اگر نکته‌ای در این مقاله برات مبهم بود یا خواستی بیشتر بدونی، همین حالا برام بنویس تا دقیق و صمیمی پاسخت رو بدم — مثل یه گفت‌وگوی واقعی 💬

برو به صفحه پرسش و پاسخ

میثم راد

من یه برنامه نویسم که حسابی با دیتابیس اوراکل رفیقم! از اونایی ام که تا چیزی رو کامل نفهمم،ول کن نیستم، یادگرفتن برام مثل بازیه، و نوشتن اینجا کمک می کنه تا چیزایی که یاد گرفتم رو با بقیه به شریک بشم، با هم پیشرفت کنیم.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *