【问题标题】:Query works with Oracle 10g but not with 11g?查询适用于 Oracle 10g 但不适用于 11g?
【发布时间】:2011-05-20 20:25:49
【问题描述】:
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;

这适用于 Oracle 10,但使用 Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production 会导致:

ORA-00979:不是 GROUP BY 表达式
ORA-06512: 在第 5 行


谁能重现/解释这个?谢谢!

【问题讨论】:

  • 我将其用于统计数据,我想决定记录是按天还是按小时分组。
  • 在我的 11gR2(64 位)上运行正常。以防万一,全横幅:Oracle 数据库 11g 企业版版本 11.2.0.1.0 - 64 位生产,具有分区、OLAP、数据挖掘和真正的应用程序测试选项

标签: sql oracle plsql oracle11g ora-00979


【解决方案1】:

如果您有权获得支持,它看起来像Bug 9478304: LOOP FAILING WITH ORA-00979: NOT A GROUP BY EXPRESSION。这似乎只影响 11.2.0.1。

【讨论】:

  • 就是这样,非常感谢!父错误 (_optimizer_distinct_agg_transform = false) 的建议解决方法解决了问题。
【解决方案2】:

我怀疑你的问题是你的SELECT 中的NULL 需要在GROUP BY 中,即使它是一个常量。不过,我无法想象为什么它会在 Oracle 10 而不是 11 中工作。

去掉NULL AS dummy_2还能用吗?

【讨论】:

  • 是的,如果我删除查询的任何部分,它就会起作用,即使DISTINCT-keyword 也会产生影响。按NULL 分组没有帮助...
  • 这听起来绝对像是 Oracle 中的一个错误。
【解决方案3】:

这可以正常工作:

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;

问题在于trn 变量和在TRUNC 函数中使用的变量。可能是bug吧。

【讨论】:

    【解决方案4】:

    在内部选择中截断 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-24
      • 2012-10-30
      • 1970-01-01
      • 2013-06-13
      • 1970-01-01
      • 1970-01-01
      • 2013-07-09
      相关资源
      最近更新 更多