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

