Неоднозначно определенная ошибка оракула в столбце

Обновлено: 04.07.2024

этот скрипт отлично работает при выполнении с использованием oracle "sqldeveloper", но выдает ошибку, когда я вызываю GET для этого запроса как API, используя ORDS (Oracle Rest Data Services). (приведенный выше запрос относится к объекту, присутствующему в Oracle APPS)

предоставьте решение этой проблемы, если кто-то работает над ORDS.

ниже приведен полный стек ошибок, с которыми я столкнулся::

25 сентября 2018 г., 1:39:21

InternalServerException [statusCode=500, Reasons=[]]

Вызвано: java.sql.SQLSyntaxErrorException: ORA-00918: столбец определен неоднозначно

at sun.reflect.GeneratedMethodAccessor18.invoke(Неизвестный источник)

на com.sun.proxy.$Proxy43.executeQuery(неизвестный источник)

Причина: ошибка: 918, позиция: 26, Sql = select * from (

выбрать q_.* , row_number() поверх (упорядочить на 1) RN___ из (

из fnd_application a, fnd_profile_options b, fnd_profile_options_tl c, fnd_profile_option_values ​​d

где RN___ между :1 и :2 , OriginalSql = select * from (

выбрать q_.* , row_number() поверх (упорядочить на 1) RN___ из (

из fnd_application a, fnd_profile_options b, fnd_profile_options_tl c, fnd_profile_option_values ​​d

где RN___ между ? и ?, Сообщение об ошибке = ORA-00918: столбец определен неоднозначно

Ответы

Добавляйте префикс к именам столбцов, которые существуют в нескольких таблицах, либо с именем таблицы, либо с ее псевдонимом и точкой (.), как в приведенных выше примерах.

Когда генерируется ORA-00918, у вас есть столбец, который был определен неоднозначно. Если имя столбца в объединении указано неоднозначно, значит, оно существует в нескольких таблицах.

  • Имена столбцов, встречающиеся в нескольких таблицах, должны начинаться с префикса, если на них ссылается имя таблицы.
  • На столбцы необходимо ссылаться как TABLE.COLUMN или TABLE_ALIAS.COLUM . Документация Oracle, которая ссылается на ORA-00918, дает следующий пример:

Чтобы исправить ошибку ORA-00918, ссылки должны начинаться с префикса имен столбцов, существующих в нескольких таблицах (либо с именем таблицы, либо с псевдонимом таблицы и точкой)

Я уже определил имя таблицы с псевдонимом, а затем я определил имя столбца с .(точкой) для запроса на выборку, также этот запрос дает ошибку при выполнении (или вызове) как API в браузере, а не в sqldeveloper , если запрос выбора не был правильно написан синтаксически, он также должен был выдавать ошибку при работе на sqldeveloper

Попробуйте распечатать исходный запрос из кода и выполнить этот запрос от разработчика sql.

Я думаю, что исходный запрос выглядит следующим образом:

OriginalSql = выберите * из (

выбрать q_.* , row_number() поверх (упорядочить на 1) RN___ из (

из fnd_application a, fnd_profile_options b, fnd_profile_options_tl c, fnd_profile_option_values ​​d

где RN___ между ? и ?

pastedImage_0.jpg

здесь я получаю правильное o/p, но давайте посмотрим, вызову ли я этот обработчик GET с помощью API.

см. приведенный ниже снимок экрана с ошибкой для того же запроса, когда я вызываю его с помощью браузера,

pastedImage_0.jpg

2) на этом изображении ниже вы можете видеть, что вызов get имеет тот же запрос, который был запущен ранее, и обратитесь к выходным данным журнала (выделены желтым цветом), здесь он дает мне ту же ошибку, которую я опубликовал ранее

pastedImage_1.jpg

Это не sql вызывает у вас проблему.

Ваша трассировка ошибки показывает, что фактический запрос имеет оболочку .

где RN___ между :1 и :2 , OriginalSql = select * from (

выбрать q_.* , row_number() поверх (упорядочить на 1) RN___ из (

из fnd_application a, fnd_profile_options b, fnd_profile_options_tl c, fnd_profile_option_values ​​d

где RN___ между ? и ?, Сообщение об ошибке = ORA-00918: столбец определен неоднозначно

Пьер Йотти

1- Во-первых, вы не можете работать с запросом с тем же псевдонимом или столбцом в ORDS Workshop. ORDS не проверяет это

Это невозможно в ORDS. Вы должны использовать другой псевдоним.

выберите a.application_id, b.application_id не будет работать. попробуйте использовать другой псевдоним здесь

выберите a.application_id application_id,b.application_id application_id_1

Пьер Йотти

Вы можете включить режим отладки, чтобы увидеть, где именно произошла ошибка?

Посмотрите, как это сделать

После включения режима отладки он будет выглядеть так

Но делайте это только для среды разработки

на самом деле, если вы видите мой запрос, который я пытался выполнить, в нем был какой-то столбец со значением "NULL", и они находятся в нескольких столбцах, ORDS не может прочитать этот столбец как нулевой для нескольких столбцов, поэтому он выдавал ошибку, что я и сделал. заключается в том, что я предоставил префикс имени таблицы для нулевого столбца и предоставил фактическое имя столбца, который я должен вызвать.

выберите user_id,'' как user_name из fnd_user; (здесь я указываю '' для значения null для user_name), если я попытаюсь запустить этот запрос, он отлично работает как для sqldeveloper, так и даже для API.

учебные вебинары по Oracle

Основным источником ошибок в системах баз данных Oracle является табличный аспект программного обеспечения. Даже те из вас, кто имеет опыт работы с базами данных, ограниченный использованием основных таблиц Microsoft Excel, знают, как часто могут возникать ошибки при вставке значений, уравнений и редактировании строк и столбцов. В этом смысле Oracle не отличается тем, что эти же компоненты могут легко привести к развитию ошибок. Сообщение ORA-00918 представляет собой только один из этих типов ошибок.

Источником ошибки ORA-00918 является ошибка при попытке объединить две или более таблиц с одинаковыми именами в разных столбцах. Это часто называют неоднозначной ссылкой. К счастью, именно из-за характера действия диагностика такого рода ошибок довольно проста. Обычно вы пытаетесь объединить таблицы, и именно в этот момент возникает ошибка, поэтому вы должны точно знать, откуда возникла проблема.

К счастью, решить эту ошибку Oracle так же просто, как найти причину проблемы. Что необходимо, так это добавить префикс к каждому столбцу с именем таблицы, которой он изначально принадлежал, а затем повторно выполнить оператор SQL. Например, если у вас есть объединенные таблицы POS и PAY, каждая из которых содержит столбец с именем DAT, то каждый раз, когда DAT используется, перед ним должен стоять префикс имени таблицы, такой как POS.DAT или PAY.DAT. .

Для дополнительной иллюстрации предположим, что вам нужно выполнить следующую инструкцию SQL, чтобы соединить две таблицы:

ВЫБЕРИТЕ date_start, pos

ОТ сотрудников, руководства

ГДЕ employee.date_start = management.date_start;

Это вернет ошибку ORA-00918, в которой будет просто указано «столбец определен неоднозначно». Итак, что вы делаете дальше? Вы добавляете префикс к столбцу с именем таблицы. Для приведенного выше примера это будет выглядеть примерно так:

ВЫБЕРИТЕ сотрудников.date_start, должность

ОТ сотрудников, руководства

ГДЕ employee.date_start = management.date_start;

Этот метод устранит ошибку, а также предоставит дополнительные сведения при сканировании данных на лету.

С надеждой

Значит, ошибку относительно легко диагностировать и устранить, так что же сложного? Ну, его действительно нет. Как только вы решите эту ошибку один раз, скорее всего, вы будете помнить, как быстро решить ее в будущем. Однако неприятный аспект ORA-00918 заключается в том, что существует не так много профилактических мер, которые можно было бы принять. Чтобы не допустить его появления, единственное, что вы действительно можете сделать, это помнить об именах, которые вы даете столбцам, и предварительно добавлять префиксы к общим именам столбцов. Если вы обнаружите, что у вас все еще возникают проблемы с решением этой проблемы с течением времени, и вы не знаете, какие шаги вам следует предпринять дальше, возможно, обратитесь к лицензированному консультанту Oracle, чтобы узнать о дальнейших действиях.

Я получаю сообщение об ошибке ниже после добавления кода, выделенного ниже.

выберите mp.id "идентификатор профиля", mp.merchant_name_en,status, mp.prod_merchant_id,mp.contact_number,mp.contact_address,mp.email,mp.type,mp.merchant_br,mp.contact_name,mp.create_timestamp, mp.update_timestamp,

pmr.bank_owner_name,pmr.bank_code, pmr.branch_code,pmr.bank_account, pmr.bank_name,pmr.bank_address,pmr.payment_comm_rate,pmr.payment_comm_type,pmr.cashin_comm_rate,pmr.cashin_comm_type,

ap.name_en как NAME333,ap.api_key как APIKEY,ap.PUBLIC_KEY,ap.PRIVATE_KEY,ap.STATUS,ap.ACCEPT_PAYMENT_TYPE,ap.ACCEPT_TOP_UP_TYPE,ap.CREATE_TIMESTAMP,ap.UPDATE_TIMESTAMP

из gold_mps.merchant_profile mp,goldd.psg_merchant_report pmr,gold_mps.merchant_company_owner mco,gold_mps.merchant_individual_owner mio,gold_mpp.app ap

где pmr.merchant_id=mp.prod_merchant_id и mco.profile_id=mp.id и mio.profile_id=mp.id и ap.id=mp.prod_merchant_id;

Я пытался присвоить столбцам псевдонимы, но все равно получаю ошибку.

Лучший ответ

mathguy

Это должно быть легко понять.

Эта ошибка возникает, когда предложение SELECT включает неполное имя столбца (имя столбца не предшествует имени таблицы или псевдониму) и по крайней мере две таблицы в предложении FROM имеют столбцы с таким именем. Это именно то, что означает сообщение об ошибке - синтаксический анализатор не знает, из какой таблицы он должен выбрать этот столбец, поскольку он "неоднозначно определен".

В предложении SELECT есть два неполных имени столбца: STATUS и ID_TYPE .

Чтобы диагностировать проблему, используйте дополнительную информацию, которая у вас есть: если вы удалите APP из соединения, запрос будет выполнен без ошибок. Проверьте, есть ли в этой таблице столбец STATUS или ID_TYPE (или, возможно, оба). Затем найдите, в какой другой таблице или таблицах есть столбцы с такими же именами.

Чтобы решить эту проблему, решите, из какой таблицы вы должны выбрать эти столбцы. В подобном запросе не должно быть каких-либо неполных имен столбцов.

Я создаю карту, чтобы заполнить карту моста для разбушевавшейся иерархии. Я думаю, что это должно быть хорошо, но когда я запускаю его, процесс завершается сбоем с ошибкой «Определение столбца ORA-00918 неоднозначно». Я взглянул на код и могу точно определить, что идет не так, но я не уверен, как это исправить. Сопоставление использует IKM SCD типа 2 и завершается ошибкой на шаге «Вставить поток в таблицу I$». Код выполняет следующий подзапрос:

ВЫБЕРИТЕ PROGRAM_D_CHILD.DIMENSION_KEY FTVPROG_COAS_CODE,

PROGRAM_D_CHILD.COAS_CODE FTVPROG_COAS_CODE ,

PROGRAM_D_PARENT.DIMENSION_KEY FTVPROG_COAS_CODE,

ОТ ODI_DEV.PROGRAM_D PROGRAM_D_CHILD,

ВЫБЕРИТЕ FTVPROG_GRANDCHILD.FTVPROG_COAS_CODE FTVPROG_COAS_CODE,

ОТ [email protected]_wouprd FTVPROG_GRANDCHILD

ГДЕ FTVPROG_GRANDCHILD.FTVPROG_NCHG_DATE = to_date(20991231, 'ГГГГММДД')

ВЫБЕРИТЕ FTVPROG_CHILD.FTVPROG_COAS_CODE FTVPROG_COAS_CODE,

ОТ [email protected]_wouprd FTVPROG_CHILD

ГДЕ FTVPROG_CHILD.FTVPROG_NCHG_DATE = to_date(20991231, 'ГГГГММДД')

ГДЕ FTVPROG_CHILD_1.FTVPROG_COAS_CODE = FTVPROG_PARENT.FTVPROG_COAS_CODE И

FTVPROG_CHILD_1.FTVPROG_PROG_CODE_PRED = FTVPROG_PARENT.FTVPROG_PROG_CODE И

PROGRAM_D_CHILD.COAS_CODE = FTVPROG_CHILD_1.FTVPROG_COAS_CODE И

PROGRAM_D_CHILD.PROGRAM_CODE = FTVPROG_CHILD_1.FTVPROG_PROG_CODE И

FTVPROG_GRANDCHILD_1.FTVPROG_COAS_CODE = FTVPROG_CHILD_1.FTVPROG_COAS_CODE И

FTVPROG_GRANDCHILD_1.FTVPROG_PROG_CODE_PRED = FTVPROG_CHILD_1.FTVPROG_PROG_CODE И

PROGRAM_D_PARENT.COAS_CODE = FTVPROG_PARENT.FTVPROG_COAS_CODE И

PROGRAM_D_PARENT.PROGRAM_CODE = FTVPROG_PARENT.FTVPROG_PROG_CODE И

FTVPROG_PARENT.FTVPROG_NCHG_DATE = to_date(20991231, 'ГГГГММДД')

Я выделил жирным шрифтом проблемные линии. Как видите, ODI присваивает трем разным столбцам одно и то же имя «FTVPROG_COAS_CODE». Это означает, что если где-то в коде что-то делает SELECT INLINE_VIEW.FTVPROG_COAS_CODE, они не будут знать, какой столбец нужно захватить, отсюда и ошибка. Кто-нибудь знает, почему ODI называет эти столбцы одинаковыми именами или как решить эту проблему?

Ответы

Я понял, что забыл упомянуть потенциально важный факт. Это в версии ODI 12c.

Я столкнулся с той же проблемой. Не могли бы вы решить проблему?

Это ошибка в текущей версии ODI. Кажется, что ODI немного теряется при попытке использовать псевдоним столбцов с одинаковым именем и в конечном итоге повторяет псевдоним во встроенном представлении. Мой клиент отправил запрос на обслуживание в Oracle и получил следующий ответ:

Эта ошибка: ОШИБКА 17843802 - REG: КОМПЛЕКСНАЯ КАРТА С ПОИСКОМ И АГРЕГАЦИЯМИ - ORA-00918: СТОЛБЦ НЕОДНОЗНАЧНО DE, исправлена ​​в версии ODI 12.1.3.0.0, которая в настоящее время недоступна.

Обходной путь, данный для этой проблемы, состоит в том, чтобы изменить порядок соединений в соединении, чтобы ODI мог правильно назвать псевдонимы, а не неправильно использовать имя по умолчанию.

Мы можем запросить бэкпорт для этой ошибки в ODI 12.1.2.0.0, так как она исправлена ​​в ODI 12.1.3.0..0.

Мы попробовали предложенный обходной путь, но он не сработал. В нашем случае у нас было около 12 внутренних таблиц, объединенных для создания встроенного представления, а затем еще около 10 левых внешних присоединенных к этому представлению. В итоге мы отделили код встроенного представления от левого внешнего соединения, создав два сопоставления: первое загружало временную таблицу, а второе использовало временную таблицу в качестве источника вместо встроенного представления. Это работает, но также является обходным путем.

Вот актуальная ошибка для встроенного представления, сгенерированная из SR моего клиента: Ошибка 18528883: ОШИБКА ORA-918 В НЕКОТОРЫХ ОТОБРАЖЕНИЯХ ПРИ СОЗДАНИИ ВСТРОЕННОГО ПРЕДСТАВЛЕНИЯ

Читайте также: