Я пытаюсь вернуть список из БД, но выдает ошибку «ORA-00918: столбец определен неоднозначно».

Когда я выполняю этот запрос на новой странице SQL, возвращает истинный список . Однако, когда я записываю его в пакет как хранимую процедуру, он возвращает ORA-00918 и пакет переходит в недопустимое состояние.

В чем причина этой разницы?

select distinct c.customer_no, m.title, c.group_id, g.name, c.pricelist_id, p.name from db.customer c
join db.pricelist p on c.pricelist_id = p.pricelist_id
join db.master m on c.customer_no = m.customer_no
join db.group g on c.group_id = g.id
where (c.customer_no = pn_customer_no  or pn_customer_no=-1)
and (c.group_id = pn_group_no  or pn_group_no=-1)
and (c.pricelist_id = pn_pricelist_no  or pn_pricelist_no=-1)
and (c.kom_type = ps_kom_tip)
order by c.customer_no asc
0
user5384571 4 Апр 2017 в 14:19

2 ответа

Лучший ответ

Новая страница SQL назначает вашим дубликатам столбцы новые временные имена столбцов. Но хранимые процедуры добавляют ваши значения в список совпадающих имен столбцов. Следовательно, два столбца имеют одинаковые имена, это путает, какое имя должно иметь желаемое имя. Как и в связке, имя столбца будет ключевым для определения значения, а значение будет значением. Вы должны изменить один из них p.name или g.name или оба.

select distinct c.customer_no, m.isim_unvan, c.group_id, g.name as groupName, c.pricelist_id, p.name as tarifeName from db.customer c
join db.pricelist p on c.pricelist_id = p.pricelist_id
join db.master m on c.customer_no = m.musteri_no
join db.group g on c.group_id = g.id
where (c.customer_no = pn_customer_no  or pn_customer_no=-1)
and (c.group_id = pn_group_no  or pn_group_no=-1)
and (c.pricelist_id = pn_pricelist_no  or pn_pricelist_no=-1)
and (c.kom_type = ps_kom_tip)
order by c.customer_no asc
0
elfekz 4 Апр 2017 в 11:21

Вы выбираете столбцы:

select distinct
       c.customer_no,
       m.title,
       c.group_id,
       g.name,           -- NAME column
       c.pricelist_id,
       p.name            -- NAME column

Когда вы запустите запрос в SQL / Plus или SQL Developer (или другой IDE), он выведет столбцы:

CUSTOMER_NO TITLE GROUP_ID NAME PRICELIST_ID NAME1

И переименует второй NAME столбец в NAME1.

В области PL / SQL он этого не сделает и попытается обработать два столбца с заданными вами именами (то есть одинаковыми именами), завершится ошибкой и вернет ORA-00918.

Вам нужно дать одному (или обоим) столбцу псевдоним, чтобы они имели разные имена.

2
MT0 4 Апр 2017 в 11:34