oracle 子查询插入给出 ora937 和 ora 979

Posted

技术标签:

【中文标题】oracle 子查询插入给出 ora937 和 ora 979【英文标题】:oracle subquery insert gives ora937 and ora 979 【发布时间】:2019-11-27 18:59:45 【问题描述】:

当子查询具有聚合函数时,我在插入 (Oracle 12.2) 时遇到了一个奇怪的错误。子查询本身运行良好,但是当我把它放在插入语句中时,oracle 给出了错误。我还发现它与插入表中的标识列(下例中的 TESTLOGEVENT.evID)有关,因为如果我删除该列,所有插入查询都可以正常工作!

create table testitems as
   (select 1 itemid, 'x001' trackingid from dual union all select 2,'x001' from dual);

create table testlogevent(
  evType varchar(50), evDesc varchar2(1000), userID varchar2(30), evDate date,
  evID  NUMBER(8) Generated as Identity);

insert into testlogevent(evType, evDesc, userid, evDate) 
  select 'testevent', max(itemid), :UserID, sysdate
   from testitems where trackingid='x001';

>>>ORA-00937:不是单组函数

选择子查询本身可以正常工作!我试图通过在子查询中添加一个不必要的 GROUP BY 来重写它以查看它是否有效。

insert into testlogevent(evType, evDesc, userid, evDate) 
 select 'testevent', max(itemid), :UserID,sysdate
   from testitems where trackingid='x001' group by 'x001'

>>>ORA-00979:不是 GROUP BY 表达式

现在 Oracle 向我发送了 ORA-00979。然而,子查询本身工作正常。

最后,当我使用 CTE 重写(第一个插入查询)时,这次 Oracle 没有抱怨,插入工作!这是怎么回事?

insert into testlogevent(evType, evDesc, userid, evDate) 
  with x as (
    select 'testevent', max(itemid), :UserID,sysdate
      from testitems where trackingid='x001')
  select * from x;

>>>插入 1 行

【问题讨论】:

如果您使用聚合函数和列,则必须在查询表达式的组中使用相同的列。这就是ORA-00937: not a single-group group function 的原因,所以...对于您的'testevent', max(itemid), :UserID, sysdate,如果 :UserID 是固定的,则您必须按部分分组为:UserID, sysdate,您不需要添加它。 是的,我知道。那不是问题。阅读整个问题,然后运行示例。 【参考方案1】:

经过一番研究,似乎当有子查询插入时,Oracle 无法推断数据类型,并且与标识列相关的一些内部错误导致了这个神秘的错误消息(如果没有标识列或在 Oracle 中它工作正常11)

当我将第一个查询插入中的绑定变量:UserID 更改为: cast(:UserID as varchar2(30)) 或简单地说::UserID||'',插入有效,因为绑定变量数据类型编译为 varchar2。这似乎也是第三次插入有效的原因。

希望 Oracle 在下一次迭代中解决此问题。

【讨论】:

以上是关于oracle 子查询插入给出 ora937 和 ora 979的主要内容,如果未能解决你的问题,请参考以下文章

Codeigniter 中的 Oracle 查询给出 ORA-01722 和 ORA-01756

Oracle SQL:ORA-01427:单行子查询返回多于一行

ORA-00913: oracle 子查询中的值太多

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

Oracle APEX 交互式报告中的错误 - ORA-01427:单行子查询返回多于一行

子查询引起的oracle数据库bug分析