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

