PL/SQL存储过程调用报错:参数数量/类型不匹配及语句被忽略
解决PL/SQL存储过程调用的参数不匹配错误
嘿,这个错误的根源很清晰——你调用存储过程时没有传入它要求的参数!
咱们来拆解一下问题:
- 你的存储过程
runCheck明确定义了两个IN OUT类型的参数:p_runId(数值型)和p_runCheck(FSS_RUN_TABLE的行类型) - 但你的调用语句
Begin PKG_FSS_SETTLEMENT.runCheck; End;完全没有传递任何参数,PL/SQL找不到对应的无参重载版本,自然就抛出了"wrong number or types of arguments"和"Statement ignored"错误。
正确的调用方式
你需要先声明匹配参数类型的变量,再传入存储过程:
DECLARE v_runId NUMBER := 0; -- 初始化数值变量匹配p_runId v_runCheck FSS_RUN_TABLE%ROWTYPE; -- 声明行类型变量匹配p_runCheck BEGIN PKG_FSS_SETTLEMENT.runCheck(v_runId, v_runCheck); -- 如果需要查看返回的参数值,可添加输出语句(需提前开启DBMS_OUTPUT) IF v_runCheck.RUNID IS NOT NULL THEN DBMS_OUTPUT.PUT_LINE('查询到的成功运行记录ID: ' || v_runCheck.RUNID); ELSE DBMS_OUTPUT.PUT_LINE('新生成的运行ID: ' || v_runId); END IF; END; /
额外的优化建议
- 调整参数类型语义:如果
p_runId只是用来输出新生成的序列值,p_runCheck只是用来返回查询到的行数据,建议把它们改成OUT类型,这样调用时不需要初始化变量,语义也更明确:Procedure runCheck(p_runId out number, p_runCheck out FSS_RUN_TABLE%rowtype) is -- 原逻辑保持不变 - 完善存储过程逻辑:当触发
NO_DATA_FOUND异常插入新记录后,p_runCheck还是空值。如果业务需要调用方拿到这条新插入的记录,可以在插入后补充查询:Exception when NO_DATA_FOUND then p_runId := RUNLOG_SEQ.NEXTVAL; insert into FSS_RUN_TABLE (RUNID, RUNSTART, RUNEND, RUNOUTCOME, REMARKS) values (p_runId, sysdate, null, null, 'RUN START'); -- 新增:把刚插入的记录赋值给p_runCheck select * into p_runCheck from FSS_RUN_TABLE where RUNID = p_runId;
内容的提问来源于stack exchange,提问作者Eric Stradlin
相关产品推荐
相关产品推荐

