简体   繁体   English

查询适用于Oracle 10g但不适用于11g?

[英]Query works with Oracle 10g but not with 11g?

DECLARE
  trn  VARCHAR2(2) := 'DD';
  cur  SYS_REFCURSOR;
BEGIN
  OPEN cur FOR
    SELECT
      TRUNC(some_date, trn),
      NULL AS dummy_2,
      COUNT( DISTINCT dummy_1 )
    FROM
      (SELECT SYSDATE AS some_date, ROWNUM AS dummy_1 FROM dual)
    GROUP BY
      TRUNC(some_date, trn);
END;

This works with Oracle 10, but with Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production it results in: 这适用于Oracle 10,但对于Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production它会导致:

ORA-00979: not a GROUP BY expression ORA-00979:不是GROUP BY表达式
ORA-06512: at line 5 ORA-06512:第5行


Can anyone reproduce/explain this? 任何人都可以复制/解释这个吗? Thanks! 谢谢!

if you have access to support, it looks like Bug 9478304: LOOP FAILING WITH ORA-00979: NOT A GROUP BY EXPRESSION . 如果你有权访问支持,它看起来像Bug 9478304:LOOP FAILING WITH ORA-00979:不是表达式的组 This seems to affect 11.2.0.1 only. 这似乎只影响11.2.0.1。

I suspect your problem is that the NULL in your SELECT needs to be in the GROUP BY even though it is a constant. 我怀疑你的问题是SELECT中的NULL需要在GROUP BY即使它是一个常量。 I can't imagine why it would work in Oracle 10 but not 11, though. 我无法想象为什么它可以在Oracle 10中工作,但不能在11中工作。

Does it work if you remove NULL AS dummy_2 ? 如果删除NULL AS dummy_2它是否NULL AS dummy_2

This works without errors: 这没有错误:

DECLARE
  trn  VARCHAR2(2) := 'DD';
  cur  SYS_REFCURSOR;
BEGIN
  OPEN cur FOR
    SELECT
      TRUNC(some_date, dtrn),
      NULL AS dummy_2,
      COUNT( DISTINCT dummy_1 )
    FROM
      (SELECT SYSDATE AS some_date, ROWNUM AS dummy_1 FROM dual) data1,
      (SELECT trn AS dtrn FROM dual) data2
    GROUP BY TRUNC(some_date, dtrn);
END;

Problem is with trn variable and variable using in TRUNC function. 问题在于使用TRUNC函数中的trn变量和变量。 Maybe it is bug. 也许是bug。

Truncating the sysdate in the inner select appears to work fine: 截断内部选择中的sysdate似乎工作正常:

DECLARE
  trn  VARCHAR2(2) := 'DD';
  cur  SYS_REFCURSOR;
BEGIN
  OPEN cur FOR
    SELECT
      some_date,
      NULL AS dummy_2,
      COUNT( DISTINCT dummy_1 )
    FROM
      (SELECT trunc(SYSDATE, trn) AS some_date, ROWNUM AS dummy_1 FROM dual)
    GROUP BY
      some_date;
END;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM