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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 13:42:43