编写PLSQL存储过程报PLS-00103 遇到END符号错误如何解决
PLSQL存储过程报错PLS-00103排查方案
报错根本原因
PLS-00103报错是因为Oracle的PL/SQL解析器对隐式游标FOR循环的语法格式要求严格,你当前代码中FOR Qrow IN (查询语句)和LOOP关键字之间间隔了注释和空行,部分版本的Oracle无法正确识别该语法结构,触发编译报错。
其他需要修正的问题
- 存储过程中声明的
r_name、n_name两个变量全程未使用,属于冗余代码,可直接删除 - 表头做了左对齐填充,输出查询结果时未做相同处理,会导致输出结果挤在一起,无法和表头对应
- 使用老式逗号连接表的写法可读性差,建议替换为标准JOIN语法
修正后完整代码
SET SERVEROUTPUT ON SIZE UNLIMITED DECLARE userInput number; PROCEDURE numberOfSupplier(x IN number) IS BEGIN -- 打印表头 dbms_output.put_line(lpad('R_NAME',25) || lpad('N_NAME',25) || lpad('COUNT(S_NATIONKEY)',25)); dbms_output.put_line(rpad('-',25,'-') || rpad('-',25,'-') || rpad('-',25,'-')); -- 隐式游标循环,LOOP紧跟查询括号,避免解析错误 FOR Qrow IN ( SELECT r.r_name, n.n_name, COUNT(s.s_nationkey) AS cnt FROM region r JOIN nation n ON r.r_regionkey = n.n_regionkey JOIN supplier s ON n.n_nationkey = s.s_nationkey GROUP BY r.r_name, n.n_name HAVING COUNT(s.s_nationkey) > x ORDER BY r.r_name ) LOOP -- 输出结果和表头对齐 dbms_output.put_line(lpad(Qrow.r_name,25) || lpad(Qrow.n_name,25) || lpad(Qrow.cnt,25)); END LOOP; END numberOfSupplier; BEGIN userInput := &MinNumberofsupplier; numberOfSupplier(userInput); END; /
额外注意事项
执行前先运行SET SERVEROUTPUT ON开启输出,否则终端不会打印查询结果。
内容的提问来源于stack exchange,提问作者bchooxg
相关产品推荐
相关产品推荐

