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
相关产品推荐
相关产品推荐

