Oracle存储过程因语法错误无法运行,请求排查修复
问题分析
报错PLS-00103的核心是语法结构混乱,EXCEPTION块位置错误,具体问题点:
IF VAR_COUNT > 0 THEN语句未用END IF;闭合,导致EXCEPTION被错误嵌套在IF结构内,编译器无法识别- EXCEPTION块必须放在主BEGIN块末尾,不能嵌套在IF/循环结构中
- 错误日志插入语句写在主END之后,既不属于任何PL/SQL块,也超出了
cur_sapid变量的作用域 - 多余的
END;语句破坏了整体块结构
修正后的存储过程代码
create or replace PROCEDURE GET_SAPID_CREATION_INFO AS ERROR_CODE NUMBER; ERROR_MESSAGE NVARCHAR2(200); VAR_SAPID_COUNT NUMBER; VAR_ROW_ID NUMBER; VAR_COUNT NUMBER; BEGIN -- 获取需更新的记录数 SELECT COUNT(1) INTO VAR_COUNT FROM TBL_PRE_POST_HOTO WHERE CREATION_SAPID IS NULL AND SAPID_REMARKS NOT LIKE '%Sap Id :-%'; -- 插入调度启动日志 INSERT INTO TBL_CMP_SAP_ID_ERRORLOG (USERNAME, SAP_ID, ERROR_MESSAGE, ERROR_TYPE, LOG_DATE) VALUES('SCHEDULER','', 'SCHEDULER STARTED','', SYSDATE); COMMIT; IF VAR_COUNT > 0 THEN -- 循环处理SAPID数据 FOR cur_sapid IN ( SELECT SAP_ID, UNIQUEID, CRNO, CMP_ID, PROCESS_REMARK FROM APP_WFM.SAPID_INPUTDATA_ENODEB ) LOOP UPDATE TBL_PRE_POST_HOTO SET CREATION_SAPID = cur_sapid.SAP_ID, SAPID_REMARKS = cur_sapid.PROCESS_REMARK WHERE ID = cur_sapid.CMP_ID; COMMIT; END LOOP; END IF; -- 闭合IF语句块 EXCEPTION WHEN OTHERS THEN ERROR_CODE := SQLCODE; ERROR_MESSAGE := SUBSTR(SQLERRM, 1, 200); ROLLBACK; -- 插入异常日志 INSERT INTO TBL_CMP_SAP_ID_ERRORLOG (USERNAME, SAP_ID, ERROR_MESSAGE, ERROR_TYPE, LOG_DATE) VALUES('SCHEDULER', '', ERROR_CODE||' : '||ERROR_MESSAGE, ERROR_CODE, SYSDATE); COMMIT; END GET_SAPID_CREATION_INFO; /
关键修正说明
- 补充
IF语句对应的END IF;,确保分支结构完整 - 将EXCEPTION块移至主BEGIN块末尾,符合PL/SQL块规范(BEGIN...EXCEPTION...END)
- 把错误日志插入逻辑移至EXCEPTION块内,保证异常发生时能正常记录,同时规避变量作用域问题
- 移除多余的
END;语句,梳理清晰块结构 - 修正日志中的拼写错误
SCHDULER为SCHEDULER
内容的提问来源于stack exchange,提问作者Nadeem
相关产品推荐
相关产品推荐

