游标FOR循环执行报错ORA-00979:单独执行SQL正常嵌入后异常
ORA-00979错误排查与解决:游标FOR循环中的GROUP BY问题
问题现象
单独执行游标内的查询SQL可得到正确结果,但将其嵌入PL/SQL游标FOR循环后,抛出ORA-00979: not a GROUP BY expression错误。
错误原因
游标查询中的别名usage是Oracle的保留字。单独执行SQL时,解析器可能因上下文宽松未触发错误,但PL/SQL对语法的检测更严格,保留字作为别名会导致解析逻辑混乱,进而误报GROUP BY表达式错误。
解决方法
将游标查询中的保留字别名替换为非保留字,同时可优化ORDER BY子句减少重复计算:
修改后的完整代码
DECLARE v_sum_of_strength number :=0; BEGIN for i in ( select to_char(time,'MM-YYYY') "stick", count(*) usage_count from my_view group by to_char(time,'MM-YYYY') order by substr("stick",6), substr("stick",1,2) ) LOOP select sum(strength) into v_sum_of_strength from batch where substr(to_char(startdate,'MM-YYYY'),1,2) <= substr('04-2022',1,2) AND substr(to_char(enddate,'MM-YYYY'),1,2) >= substr('04-2022',1,2); dbms_output.put_line(v_sum_of_strength); dbms_output.put_line('------------------'); END LOOP; END;
额外提示
原代码中注释的i.candle应为i.stick(与游标查询的别名对应),若需要输出分组标识,可取消注释并修正为dbms_output.put_line(i.stick);。
内容的提问来源于stack exchange,提问作者Vinayak
相关产品推荐
相关产品推荐

