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

PLS-00103错误求助:Oracle PL/SQL包体游标声明致编译失败

PLS-00103错误排查:包体存储过程的声明位置问题

问题说明

用于计算学生成绩评级的PL/SQL存储过程,独立版本与包规范均可正常编译,但在包体中实现该过程时触发PLS-00103编译错误,提示第6行遇到符号"C_NOTES",预期为:= . ( @ % ;等符号。错误根源是将游标c_notes和变量result声明在了BEGIN语句之后。

错误原因

PL/SQL块的语法结构有严格区分:

  • 声明区:位于IS/AS与BEGIN之间,只能存放游标、变量、常量等元素的定义语句;
  • 执行区:位于BEGIN与END之间,只能编写可执行逻辑(如循环、条件判断、赋值操作等)。
    包体中的存储过程违反了这一规则,将声明语句放到了执行区,导致编译失败。

修正后的包体代码

将游标和变量的声明移至IS与BEGIN之间的声明区即可解决问题:

create or replace package body package_prcd
is
    procedure pr_resultat
    IS
        CURSOR  c_notes is  
        select avg(points) moy, num_eleve
        from resultats
        group by num_eleve;

        result varchar(20) := '';
    begin
        for elem in c_notes LOOP
           if elem.moy < 10 then
            result := 'failure';
           elsif elem.moy >= 10 and elem.moy < 12 then
            result := 'average';
           elsif elem.moy >= 12 and elem.moy < 14 then
            result := 'pretty good';
           elsif elem.moy >= 14 and elem.moy < 16 then
            result := 'good';
           elsif elem.moy >= 16 then
            result := 'very good';
           end if;
           DBMS_OUTPUT.PUT_LINE(elem.num_eleve || '->' || result);
        end loop;
    end;
end package_prcd;
/

简化优化方案

可以使用PL/SQL的隐式游标替代显式游标,进一步简化代码,同时避免声明位置错误:

create or replace package body package_prcd
is
    procedure pr_resultat
    IS
        result varchar(20) := '';
    begin
        for elem in (select avg(points) moy, num_eleve from resultats group by num_eleve) LOOP
           if elem.moy < 10 then
            result := 'failure';
           elsif elem.moy >= 10 and elem.moy < 12 then
            result := 'average';
           elsif elem.moy >= 12 and elem.moy < 14 then
            result := 'pretty good';
           elsif elem.moy >= 14 and elem.moy < 16 then
            result := 'good';
           elsif elem.moy >= 16 then
            result := 'very good';
           end if;
           DBMS_OUTPUT.PUT_LINE(elem.num_eleve || '->' || result);
        end loop;
    end;
end package_prcd;
/

内容的提问来源于stack exchange,提问作者Frik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 10:40:25