2010-12-06 93 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:不是GROUP BY表达
ORA-06512:在第5行


任何人都可以重现/解释这个?谢谢!

+0

我使用这个对,我想,以决定是否记录应该按天或按小时分组统计。 – 2010-12-06 08:25:52

+0

在我的11gR2(64位)上正常工作。以防万一,完整的横幅:Oracle数据库11g企业版版本11.2.0.1.0 - 64位生产 使用分区,OLAP,数据挖掘和实际应用测试选项 – 2010-12-06 10:47:47

回答

2

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

如果您删除NULL AS dummy_2,它工作正常?

+0

是的,它工作,如果我删除查询的任何部分,甚至“DISTINCT”关键字有所不同。通过`NULL`分组不会有帮助... – 2010-12-06 08:41:00

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; 

问题是trn变量,变量TRUNC功能使用。也许这是错误。

1

截断在内部选择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; 
相关问题