Oracle数据绑定时调用GET_MANUAL_LOS_REQ_STATUS参数错误求助
ORA-06550 存储过程调用参数错误:原因排查与修复方案
错误原因
存储过程GET_MANUAL_LOS_REQ_STATUS中,P_OUTSTATUS和P_MESSAGE定义为VARCHAR2类型的输出参数,但C#调用代码里错误地将这两个参数的OracleDbType设置为OracleDbType.RefCursor,参数类型完全不匹配,导致Oracle抛出参数数量/类型不匹配的错误。
修复方案
修改C#代码中P_OUTSTATUS和P_MESSAGE的参数类型为OracleDbType.Varchar2,匹配存储过程的定义:
public DataTable Bind_Grid_Data() { OracleConnection conn = new OracleConnection(ConfigurationManager.ConnectionStrings["ConnectionStringAirFiber"].ConnectionString); try { OracleCommand cmd = new OracleCommand(); cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = ConfigurationManager.AppSettings["GET_MANUAL_LOS_REQ_STATUS"]; cmd.Connection = conn; // 游标参数,类型设置正确 cmd.Parameters.Add(new OracleParameter { ParameterName = "P_CURR", OracleDbType = OracleDbType.RefCursor, Direction = ParameterDirection.Output }); // 修正为Varchar2类型,匹配存储过程定义 cmd.Parameters.Add(new OracleParameter { ParameterName = "P_OUTSTATUS", OracleDbType = OracleDbType.Varchar2, Size = 500, Direction = ParameterDirection.Output }); // 修正为Varchar2类型,匹配存储过程定义 cmd.Parameters.Add(new OracleParameter { ParameterName = "P_MESSAGE", OracleDbType = OracleDbType.Varchar2, Size = 500, Direction = ParameterDirection.Output }); if (conn.State != ConnectionState.Open) conn.Open(); OracleDataAdapter daIPColo = new OracleDataAdapter(cmd); DataTable dtIPColo = new DataTable(); daIPColo.Fill(dtIPColo); // 可选:读取存储过程返回的状态信息 string outStatus = cmd.Parameters["P_OUTSTATUS"].Value.ToString(); string message = cmd.Parameters["P_MESSAGE"].Value.ToString(); return dtIPColo; } catch (Exception ex) { throw; } finally { if (conn.State == ConnectionState.Open) conn.Close(); } }
额外说明
- 游标参数
P_CURR的类型设置正确,无需修改; - 执行
Fill方法后,可以读取P_OUTSTATUS和P_MESSAGE的参数值,获取存储过程的执行状态; - 确保配置文件中存储过程名称与数据库中定义的完全一致。
内容的提问来源于stack exchange,提问作者Nadeem
相关产品推荐
相关产品推荐

