为何Oracle聚合SQL正常但PL/SQL块报ORA-00934组函数不允许错误
错误原因
两段代码的查询逻辑完全一致,报错是因为PL/SQL的SELECT INTO语法使用不符合规范,和聚合函数的逻辑无关:
- 纯SQL中
SELECT后直接跟多个返回列是标准语法,所以第一段代码可以正常执行。 - PL/SQL要求
SELECT ... INTO语句中,所有待赋值的变量必须统一放在同一个INTO子句中,和SELECT后的返回列按顺序一一对应,不允许每个返回列后单独写INTO。
你写的报错行:
select count(*) into res, count(distinct t.title_id) into titles
不符合上述语法要求,Oracle会误将第二个INTO后的titles识别为查询引用的表字段,导致聚合函数后直接跟字段的非法语法,触发ORA-00934: 此处不允许使用分组函数报错。
修复方案
将多个INTO合并为一个即可,修改后的正确代码如下:
set serveroutput on; DECLARE lst_name employees.last_name%TYPE := '&lst'; fst_name employees.first_name%TYPE := '&fst'; res NUMBER(3); titles NUMBER(3); BEGIN -- 调整INTO写法,所有变量放在同一子句,和返回列顺序对应 select count(*), count(distinct t.title_id) into res, titles from member m, rental r, title t where m.member_id = r.member_id and r.title_id = t.title_id and m.first_name = fst_name and m.last_name = lst_name; dbms_output.put_line(fst_name || ' ' || lst_name || ':' || res || ' 租赁总单数,租赁的不同title数量:' || titles); END; /
内容的提问来源于stack exchange,提问作者Johnny
相关产品推荐
相关产品推荐

