2010-12-06 22 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; 

Esto funciona con Oracle 10, pero con Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production el resultado es:¿La consulta funciona con Oracle 10g pero no con 11g?

ORA-00979: no es una expresión GROUP BY
ORA-06512: en la línea 5


¿Alguien puede reproducir/explicar esto? ¡Gracias!

+0

estoy usando esto para las estadísticas en el que necesito para decidir si los registros deben ser agrupados por día o por hora. –

+0

Funciona bien en mi 11gR2 (64 bits). Por si acaso, banner completo: Oracle Database 11g Enterprise Edition Versión 11.2.0.1.0 - Producción de 64 bits Con las opciones Partitioning, OLAP, Data Mining y Real Application Testing –

Respuesta

2

Sospecho que su problema es que el NULL en su SELECT debe estar en el GROUP BY aunque sea una constante. No puedo imaginar por qué funcionaría en Oracle 10 pero no en 11, sin embargo.

¿Funciona si elimina NULL AS dummy_2?

+0

Sí, funciona si elimino cualquier parte de la consulta, incluso la palabra clave 'DISTINCT' hace la diferencia. Agrupar por 'NULL' no ayuda ... –

+1

Definitivamente suena como un error en Oracle. – Gabe

1

Esto funciona sin errores:

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; 

El problema es que con trn variable y variable usando en TRUNC función. Tal vez es un error.

1

truncar el sysdate en el selecto interior parece funcionar bien:

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; 
Cuestiones relacionadas