2010-12-06 55 views
7
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と、それは、その結果:クエリはOracle 10gでは機能しますが、11gでは機能しませんか?

ORA-00979:式
ORA-06512 BYないGROUP:ライン5


誰でもこれを再現/説明できますか?ありがとう!

+0

私はレコードが日によってまたは時間によってグループ化するかどうかを決定する統計のためにこれを使用しています。 –

+0

私の11gR2(64ビット)で正常に動作します。 Oracle Database 11g Enterprise Editionリリース11.2.0.1.0 - 64bit Production パーティショニング、OLAP、データ・マイニングおよびリアル・アプリケーション・テスト・オプション –

答えて

6

サポートにアクセスできる場合は、Bug 9478304: LOOP FAILING WITH ORA-00979: NOT A GROUP BY EXPRESSIONのように見えます。これは11.2.0.1にのみ影響します。内側のSELECTでSYSDATEを切捨て

+0

それは、ありがとう!親バグの回避策( '_optimizer_distinct_agg_transform = false')は、問題を解決します。 –

2

SELECTNULLは、定数でもGROUP BYにする必要があると思われます。私はなぜそれがOracle 10で動作するのだろうと思っていますが、11では動作しません。

NULL AS dummy_2を削除すると機能しますか?

+0

はい、問合せの一部を削除しても機能します'DISTINCT'キーワードは違いをもたらします。 NULLでグルーピングすることは役に立ちません... –

+1

間違いなくOracleのバグのように聞こえます。 – Gabe

1

これはエラーなしで動作します:

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; 

問題はTRUNC関数内で使用してtrn変数と変数です。多分それはバグです。

1

が正常に動作するように見える:

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; 
関連する問題