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 页面中执行查询的主要内容,如果未能解决你的问题,请参考以下文章

修复错误 ORA-00918

ORA-00918: 使用数据透视时列定义不明确

不确定为啥会出现 ORA-00918 列定义不明确

ORA-00918: column ambiguously defined

ORA-00918: 列定义不明确,使用 DB Link

Oracle 12c - 插入到选择查询中的不明确列,ORA-00918