ORA-00918 从存储过程返回,但它可以在 SQL 页面中执行查询
Posted
技术标签:
【中文标题】ORA-00918 从存储过程返回,但它可以在 SQL 页面中执行查询【英文标题】:ORA-00918 returns from stored procedure but it works executing a query in SQL Page 【发布时间】:2017-04-04 11:19:05 【问题描述】:我正在尝试从 db 返回一个列表,但它给了我错误“ORA-00918: column ambiguously defined”。
当我在新的 SQL 页面中执行此查询时,它返回 true 列表。但是,当我将它作为存储过程写入包时,它会返回 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
【问题讨论】:
【参考方案1】:您正在选择列:
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】:新的 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
【讨论】:
以上是关于ORA-00918 从存储过程返回,但它可以在 SQL 页面中执行查询的主要内容,如果未能解决你的问题,请参考以下文章