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

C#调用SP_WF_GET_REQUESTDETAILS存储过程报PLS-00306错误求助

报错核心原因
  • 存储过程SP_WF_GET_REQUESTDETAILS共定义6个入参/出参:P_IN_KEY(入参)、P_USER_CODE(入参)、P_OUT_OPEN(出参游标)、P_OUT_APPROVED(出参游标)、P_OUT_REJECTED(出参游标)、P_OUT_TBL(出参游标)
  • C#调用代码仅传入5个参数,缺失了P_OUT_TBL对应的输出参数,直接触发Oracle的PLS-00306参数数量不匹配校验
  • 若补全参数后仍报类型错误,大概率是调用时未开启按参数名绑定,Oracle默认按传入顺序匹配参数,一旦顺序和存储过程定义不一致就会判定类型不匹配
具体修复步骤
  • 第一步:补全C#调用时缺失的P_OUT_TBL参数,将其设置为Oracle游标类型的输出参数,修正后的参数拼接逻辑参考:
var paramList = new List<OracleParameter>();
// 原有入参保留
paramList.Add(new OracleParameter("P_IN_KEY", "GET_REQUEST_COUNT"));
paramList.Add(new OracleParameter("P_USER_CODE", Usercode));

// 原有三个统计数输出游标参数
var paramOpen = new OracleParameter("P_OUT_OPEN", OracleType.Cursor) { Direction = ParameterDirection.Output };
var paramApproved = new OracleParameter("P_OUT_APPROVED", OracleType.Cursor) { Direction = ParameterDirection.Output };
var paramRejected = new OracleParameter("P_OUT_REJECTED", OracleType.Cursor) { Direction = ParameterDirection.Output };
// 补全缺失的P_OUT_TBL输出参数
var paramTbl = new OracleParameter("P_OUT_TBL", OracleType.Cursor) { Direction = ParameterDirection.Output };

paramList.AddRange(new[] { paramOpen, paramApproved, paramRejected, paramTbl });
  • 第二步:检查通用执行方法SPExcute的实现,确保创建OracleCommand时设置了BindByName = true,彻底规避参数顺序不匹配带来的类型校验错误
  • 第三步:修复存储过程的空游标问题:当前P_IN_KEY='GET_REQUEST_COUNT'分支下,代码并未打开P_OUT_TBL游标,后续.NET端读取该参数值时会触发空指针异常,可在该分支末尾补充空结果集的游标打开逻辑:
-- 在GET_REQUEST_COUNT分支的最后添加
OPEN P_OUT_TBL FOR SELECT NULL AS TEMP_COL FROM DUAL WHERE 1=2;

内容的提问来源于stack exchange,提问作者Binu Judith J T

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 11:36:05