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

PLS-00103错误求助:Oracle存储过程编译遇'SET'符号问题

PLS-00103错误排查与解决办法

嘿,我来帮你搞定这个编译错误!咱们一步步来分析:

错误原因

你遇到的PLS-00103: Encountered the symbol "SET"错误,核心问题有两个:

  1. SQL*Plus命令和PL/SQL存储过程定义混编了
    当你编译CREATE OR REPLACE PROCEDURE时,数据库会把END;之后的SET语句当成PL/SQL代码的一部分。但SET是SQL*Plus的专属命令,不属于PL/SQL语法范畴,编译器自然会报错。
  2. 存储过程内部的游标访问错误
    你写的DBMS_OUTPUT.Put_line(c_proj.ProjectID);是错的——c_proj是游标对象,你已经把游标中的数据抓取到了r_proj这个行类型变量里,应该访问r_proj.ProjectID才能拿到当前行的项目ID。

解决办法

方案1:拆分编译与执行步骤

把存储过程的定义和执行命令分成两个独立的操作:

  1. 先编译修正后的存储过程:
CREATE or REPLACE PROCEDURE SP_Projects is
    Cursor C_proj is SELECT PROJECTID FROM PROJECT ORDER BY PROJECTID;
    R_proj C_proj%ROWTYPE;
BEGIN
    OPEN c_proj;
    LOOP
        FETCH c_proj into r_proj;
        EXIT when c_proj%NOTFOUND;
        DBMS_OUTPUT.Put_line(r_proj.ProjectID); -- 修正为行变量访问
    END LOOP;
    CLOSE c_proj;
END;
/ -- 用斜杠执行存储过程定义
  1. 再执行调用命令:
SET SERVEROUTPUT ON;
EXEC SP_Projects;

方案2:同一脚本中正确分隔代码

如果想在同一个脚本里完成编译和执行,关键是用/来标记存储过程定义的结束,让SQL*Plus区分开PL/SQL块和后续命令:

CREATE or REPLACE PROCEDURE SP_Projects is
    Cursor C_proj is SELECT PROJECTID FROM PROJECT ORDER BY PROJECTID;
    R_proj C_proj%ROWTYPE;
BEGIN
    OPEN c_proj;
    LOOP
        FETCH c_proj into r_proj;
        EXIT when c_proj%NOTFOUND;
        DBMS_OUTPUT.Put_line(r_proj.ProjectID);
    END LOOP;
    CLOSE c_proj;
END;
/ -- 这里的斜杠告诉编译器:前面的PL/SQL块结束了
SET SERVEROUTPUT ON;
EXEC SP_Projects;

小提示

在SQL*Plus环境中,/的作用是执行当前缓冲区中的PL/SQL块或SQL语句,它能明确告诉数据库哪里是一个代码单元的结束,避免把后续命令误判为PL/SQL代码的一部分。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 16:53:01