Oracle 12c调用带出入参存储过程报无效SQL及出参获取失败
Oracle 12c存储过程调用报错及输出参数获取问题解决
问题原因及修复步骤
1. 解决“无效SQL语句”报错
调用存储过程时未指定CommandType.StoredProcedure,Dapper默认会将传入的字符串当作SQL文本执行,而非存储过程调用,导致报错。必须在Execute方法中明确指定命令类型。
2. 输出参数无法获取值的修复
- 对于
Varchar2类型的输出参数,必须指定长度,否则Dapper无法分配足够的缓冲区存储返回值。 - 获取输出参数时,参数名称要与添加到
OracleDynamicParameters中的名称完全一致(注意Oracle默认参数名称为大写,需与代码中定义匹配)。 - 无需手动调用
connection.Close(),using语句会自动管理连接的打开和释放。
修改后的完整代码
using (OracleConnection connection = new OracleConnection(_connection.ConnectionString)) { var parameters = new OracleDynamicParameters(); parameters.Add("in_RQ_SALES_REQUEST", OracleDbType.Int32, ParameterDirection.Input, 14478); parameters.Add("in_RQ_AMOUNT", OracleDbType.Int32, ParameterDirection.Input, 2500); parameters.Add("in_RQ_CURRENCY", OracleDbType.Char, ParameterDirection.Input, "YER", 3); parameters.Add("in_RQ_TP_CHANNEL", OracleDbType.Char, ParameterDirection.Input, "APP", 3); parameters.Add("in_RQ_ACC_TYPE", OracleDbType.Varchar2, ParameterDirection.Input, "SUB"); parameters.Add("in_RQ_MAIN_SRVC_ID", OracleDbType.Int32, ParameterDirection.Input, 1); parameters.Add("in_RQ_SUB_SRVC_ID", OracleDbType.Int32, ParameterDirection.Input, 1); parameters.Add("in_RQ_INTERNAL_EXTRA1", OracleDbType.Varchar2, ParameterDirection.Input, "123456"); parameters.Add("in_RQ_INTERNAL_EXTRA2", OracleDbType.Varchar2, ParameterDirection.Input, "775550902"); // 添加输出参数,Varchar2类型需指定长度(根据存储过程定义调整size值) parameters.Add("P_OUT_RESULT", OracleDbType.Int32, ParameterDirection.Output); parameters.Add("P_OUT_RESULT_DESC", OracleDbType.Varchar2, ParameterDirection.Output, size: 200); // 指定命令类型为存储过程,执行调用 connection.Execute("SP_INIT_SALES_REQUEST", parameters, commandType: CommandType.StoredProcedure); // 获取输出参数值,名称需与添加时完全一致 int outResult = parameters.Get<int>("P_OUT_RESULT"); string outResultDesc = parameters.Get<string>("P_OUT_RESULT_DESC"); return Ok($"result => {outResult}, desc => {outResultDesc}"); }
额外注意事项
- 确保存储过程的参数名称与代码中定义的参数名称完全匹配(若存储过程创建时使用双引号区分大小写,代码中需对应使用相同大小写)。
- 检查
OracleDbType的映射是否与存储过程参数类型一致,比如Char类型的长度需与存储过程定义匹配。
内容的提问来源于stack exchange,提问作者فضل الشمهاني
相关产品推荐
相关产品推荐

