You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 06:54:04