Запрос работает с Oracle 10g, но не с 11g? - PullRequest
7 голосов
/ 06 декабря 2010
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


Кто-нибудь может воспроизвести / объяснить это?Спасибо!

Ответы [ 4 ]

6 голосов
/ 06 декабря 2010

если у вас есть доступ к поддержке, это выглядит как Ошибка 9478304: СБОЙ ПЕТЛИ С ORA-00979: НЕ ГРУППА ВЫРАЖЕНИЕМ Похоже, это влияет только на 11.2.0.1.

2 голосов
/ 06 декабря 2010

Я подозреваю, что ваша проблема в том, что NULL в вашем SELECT должно быть в GROUP BY, даже если это константа.Я не могу себе представить, почему это будет работать в Oracle 10, но не в 11.

Будет ли это работать, если вы удалите NULL AS dummy_2?

1 голос
/ 06 декабря 2010

Усечение системной даты во внутреннем выделении работает нормально:

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;
1 голос
/ 06 декабря 2010

Это работает без ошибок:

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.Может быть, это ошибка.

...