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

PLS-00103错误咨询:存储过程定义时遇意外符号IS

Oracle PL/SQL 错误PLS-00103排查与解决

咱们来一步步拆解你遇到的这个PLS-00103错误,先揪出代码里的问题,再给你靠谱的修正方案:

错误原因分析

你收到的错误提示PLS-00103: 遇到符号"IS",但期望以下之一::= . ( @ % ; not null range default character,根源在第4行的游标定义,具体问题有这几个:

1. 游标用法完全错误

PL/SQL里的游标(CURSOR)只能用来封装SELECT查询语句,绝对不能用来包裹INSERT/UPDATE/DELETE这类DML操作。你写的CRUSOR C1 IS INSERT INTO...完全不符合语法规则,解析器看到IS后面跟着INSERT,根本不知道该怎么处理,所以直接抛出了语法错误。

2. 拼写小失误

顺便提一句,CRUSOR是拼写错了,正确的单词是CURSOR,不过这是次要问题,核心还是游标用错了地方。

3. 逻辑判断偏差

你想用C1%FOUND判断插入是否成功,这也是行不通的——游标%FOUND是用来判断查询游标是否找到数据的,和INSERT操作没有半毛钱关系哦。

解决方法&修正后的代码

我们直接重构代码,去掉错误的游标,直接执行INSERT,用SQL%ROWCOUNT来判断插入是否生效,同时完善异常处理:

CREATE OR REPLACE PACKAGE BODY EMP_PK AS
PROCEDURE INSERT_TR(EMPNO EMP_20171250.EMPNO%TYPE,ENAME EMP_20171250.ENAME%TYPE,SAL EMP_20171250.SAL%TYPE) IS
    INSERT_ERROR EXCEPTION;
BEGIN
    -- 直接执行插入操作
    INSERT INTO EMP_20171250(EMPNO,ENAME,SAL) VALUES(EMPNO,ENAME,SAL);
    
    -- 通过SQL%ROWCOUNT判断是否有行被插入
    IF SQL%ROWCOUNT > 0 THEN
        DBMS_OUTPUT.PUT_LINE('RECORD INSERTED');
    ELSE
        RAISE INSERT_ERROR;
    END IF;
EXCEPTION
    WHEN INSERT_ERROR THEN
        DBMS_OUTPUT.PUT_LINE('ERROR WHILE RECORD INSERTION');
    -- 新增捕获主键重复的常见异常,提示更明确
    WHEN DUP_VAL_ON_INDEX THEN
        DBMS_OUTPUT.PUT_LINE('ERROR: 员工编号已存在,无法重复插入');
    -- 捕获其他未知异常
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('未知错误详情: ' || SQLERRM);
END INSERT_TR;
END EMP_PK;

关键修正说明:

  • 删掉了错误的游标定义,直接执行INSERT语句
  • 用SQL%ROWCOUNT获取DML操作影响的行数,这才是判断插入是否成功的正确方式
  • 新增了对DUP_VAL_ON_INDEX(主键/唯一键重复)这类常见插入异常的捕获,给的错误提示更具体
  • 保留了你的自定义异常,同时补充了通用异常处理,覆盖更多场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 20:32:42