Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты на сайте предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, программного обеспечения, баз данных, сетевого оборудования и других компонентов инфраструктуры. Перед выполнением действий создайте резервную копию и по возможности протестируйте изменения в безопасной среде. Пользователь самостоятельно оценивает риски и несет ответственность за результат. При отсутствии необходимых знаний обратитесь к квалифицированному ИТ-специалисту.

ORA-00904 1С:Предприятие и СУБД

Ошибка ORA-00904: invalid identifier в Oracle DB — исправление запросов

Обновлено: 26.08.2026 · Официальная документация ↗
  • Ошибка 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';
💡 Практика специалистов: При генерации схем ORM-библиотеками (Hibernate, Entity Framework) отключайте автоматическое оборачивание имен таблиц и полей в двойные кавычки, чтобы не создавать поля с case-sensitive регистром в словаре Oracle.

Частые вопросы (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.

Полезные материалы
Рекомендуем