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

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,提问作者فضل الشمهاني

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 17:27:42