Я только что встретил странное поведение в Oracle, где я ожидал бы, что ORA-00918 будет поднят, но это не так. Возьмите этот запрос, например.
SELECT *
FROM USER_TABLES TAB
JOIN USER_TRIGGERS TRG ON TRG.TABLE_NAME = TAB.TABLE_NAME
WHERE STATUS = 'DISABLED'
Этот запрос, как правило, ищет информацию о таблицах с отключенными триггерами, но обратите внимание, что это не проблема, которую я пытаюсь решить. Проблема не уникальна для этого запроса, словаря данных, представлений или таблиц; насколько я могу судить, это относится к любому набору таблиц или представлений (из двух или трех, которые я пробовал).
Во всяком случае, попробуйте запустить этот запрос, и вы получите ORA-00918, потому что оба USER_TABLES
и USER_TRIGGERS
имеют столбец с именем STATUS
, поэтому для запроса запроса для выполнения предложения WHERE
необходимо изменить на TRG.STATUS
. Хорошо, круто, но попробуйте вместо этого присоединиться к другой таблице.
SELECT *
FROM USER_TABLES TAB
JOIN USER_TRIGGERS TRG ON TRG.TABLE_NAME = TAB.TABLE_NAME
JOIN USER_CONSTRAINTS CON ON CON.TABLE_NAME = TAB.TABLE_NAME
WHERE STATUS = 'DISABLED'
Этот запрос, не определяя, какую колонку STATUS вы подразумеваете, волшебным образом работает! Не обращайте внимания на семантику или то, что возвращает запрос, нет ошибки. USER_CONSTRAINTS
тоже имеет столбец с именем STATUS
, так как он не знает, что делать, когда есть два столбца на выбор, но все в порядке с еще большей двусмысленностью?
Все это на 10.2.0.3.0 кстати, и по существу ORA-00918 перестает подниматься, если в вашем запросе содержится более двух таблиц. Если это ошибка Oracle, знает ли кто-нибудь, когда она была исправлена, и поэтому какая версия Oracle может вызвать проблемы с ковбойским кодом, если наша база данных будет обновлена?
Обновление
Благодаря BQ для демонстрации ошибки исправлено в 11.2.0.1.0. Bounty для всех, кто может показать его исправленным в более ранней версии!