环境:oracle database 11gr2(11.2.0.2) on linux 故障现象: 执行group by语句报错ora-00979。具体的sql如下:sqlgt; select
环境:oracle database 11gr2(11.2.0.2) on linux
故障现象: 执行group by语句报错ora-00979。
具体的sql如下:
sql> select a.d1,a.exit_type,round(a.cnt1/b.cnt2*100,2) from
2 (select substr(login_date,1,8) d1,exit_type,count(*) cnt1 from xxx_connect_log group by substr(login_date,1,8),exit_type) a,
3 (select substr(login_date,1,8) d2 ,count(*) cnt2 from xxx_connect_log group by substr(login_date,1,8) ) b
4 where a.d1=b.d2 order by a.d1,a.exit_type;
(select substr(login_date,1,8) d2 ,count(*) cnt2 from xxx_connect_log group by substr(login_date,1,8) ) b
*
error at line 3:
ora-00979: not a group by expression
这条语句在其他大区的db上执行均ok,在体验服db上执行报错。从语法上看,确实是完全没问题的。
碰到这种ora-报错的情况,我们可以通过设置errorstack对错误堆栈进行跟踪,将错误的后台信息比较详尽的转储到跟踪文件,,供分析研究。
errorstack的四个级别及说明:
0 error stack only
1 error stack and function call stack
2 as level 1 plus the process state
3 as level 2 plus the context area
errorstack仅在特定的错误出现的时候才被触发。可以在实例或者会话级别进行设置。
下面我们进行979的errorstack跟踪:
sql> alter system set events='979 trace name errorstack forever,level 3';
system altered.
sql> select a.d1,a.exit_type,round(a.cnt1/b.cnt2*100,2) from
2 (select substr(login_date,1,8) d1,exit_type,count(*) cnt1 from xxx_connect_log group by substr(login_date,1,8),exit_type) a,
3 (select substr(login_date,1,8) d2 ,count(*) cnt2 from xxx_connect_log group by substr(login_date,1,8) ) b
4 where a.d1=b.d2 order by a.d1,a.exit_type;
(select substr(login_date,1,8) d2 ,count(*) cnt2 from xxx_connect_log group by substr(login_date,1,8) ) b
*
error at line 3:
ora-00979: not a group by expression
sql> alter system set events='979 trace name errorstack off';
system altered.
相关阅读:
spfile 错误导致数据库无法启动(ora-01565)
ora-01172、ora-01151错误处理
ora-00600 [2662]错误解决
ora-01078 和 lrm-00109 报错解决方法
ora-00471 处理方法笔记