Ошибка ORA-00904: invalid identifier в Oracle DB — исправление запросов
- Ошибка
ORA-00904: "COLUMN_NAME": invalid identifierпри компиляции PL/SQL пакетов, представлений или выполнении SQL-запросов. - Сбои приложений после обновления схемы БД или миграции с других СУБД (PostgreSQL, MS SQL).
- Запрос ссылается на поле, которое отсутствует в таблице или написано с нарушением правил именования.
1. Проверка реального списка и регистра колонок таблицы
SELECT column_name, data_type, data_length, nullable
FROM all_tab_columns
WHERE table_name = 'MY_TABLE'
AND owner = 'SCHEMA_NAME'
ORDER BY column_id;2. Проблема чувствительности к регистру (Case Sensitivity и двойные кавычки)
Если колонка была создана в кавычках в нижнем регистре (CREATE TABLE t ("myCol" INT);), Oracle требует явного экранирования кавычками во всех запросах:
-- Ошибка: ORA-00904
SELECT mycol FROM t;
-- Корректное выполнение:
SELECT "myCol" FROM t;3. Проверка алиасов таблиц в сложных подзапросах (Scoping)
-- Ошибка ORA-00904: алиас 'b' недоступен на третьем уровне вложенности
SELECT * FROM table_a a
WHERE a.id IN (
SELECT b.id FROM table_b b WHERE b.code IN (
SELECT c.code FROM table_c c WHERE c.ref_id = a.id AND c.flag = b.flag -- b.flag вызовет ORA-00904
)
);4. Проверка прав доступа к объектам через синонимы
Если запрос выполняется к представлению или синониму, убедитесь, что базовый объект валиден и пользователь имеет права на чтение:
SELECT status, object_type FROM all_objects WHERE object_name = 'MY_VIEW'; Частые вопросы (FAQ)
Почему ORA-00904 возникает при вызове пользовательской функции?
Если функция написана на PL/SQL и вызывается в SQL-запросе, но не найдена (или у пользователя нет прав EXECUTE), парсер Oracle интерпретирует ее имя как имя несуществующего столбца таблицы и возвращает ORA-00904.
Как ключевые слова Oracle влияют на ORA-00904?
Если имя столбца совпадает с зарезервированным словом Oracle (например, COMMENT, DATE, UID, NUMBER), оно должно создаваться и запрашиваться исключительно в двойных кавычках.
Может ли ORA-00904 возникать из-за скрытых (Invisible) колонок?
Нет, невидимые колонки (INVISIBLE) доступны по прямому имени в SELECT col FROM t, но не выводятся при SELECT * FROM t.
Почему ORA-00904 возникает при создании функционального индекса?
При создании индекса по выражению (Function-Based Index) функции должны быть строго детерминированными (DETERMINISTIC) и принадлежать схеме с корректными правами, иначе парсер индекса выдаст ORA-00904.