如何通过C# Dapper接收Oracle输出变量?
如何用Dapper从Oracle接收输出变量
我来帮你解决这个问题!你之前的写法之所以拿到0,核心原因是**dbms_output.put_line只是在Oracle服务器的控制台打印变量,并不会把值返回给客户端**——Dapper根本接收不到这个打印输出,所以QueryFirstOrDefault<int>只能拿到int类型的默认值0。下面给你两种可行的解决方案:
方案1:使用Oracle OUT参数(推荐用于多输出值场景)
调整PL/SQL代码
修改你的匿名块,把需要输出的变量绑定到一个外部可见的OUT参数:
DECLARE var_zi_controle_id NUMBER; BEGIN -- 你的原有业务逻辑(比如插入操作) INSERT INTO your_table (col1, col2, ...) VALUES (... ,NULL /*CLIENTE_GRUPO_CPF*/ ,'P' /*LOTE_PRODUCAO_PEDIDO*/ ,'N' /*LIBERACAO_COMERCIAL*/ ,NULL /*USUARIO_LIB_COMERCIAL*/ ,NULL /*DATA_LIB_COMERCIAL*/ ,NULL /*HORA_LIB_COMERCIAL*/ ,'L' ) RETURNING zi_controle_id INTO var_zi_controle_id; -- 这里假设通过RETURNING获取ID,根据实际逻辑调整 COMMIT; -- 将变量赋值给外部绑定的OUT参数 :output_id := var_zi_controle_id; END;
C#代码(使用Dapper+Oracle参数)
需要引用Oracle官方驱动(比如Oracle.ManagedDataAccess.Client),通过OracleParameter定义输出参数:
using Oracle.ManagedDataAccess.Client; // 创建输出参数,指定类型和方向 var outputParam = new OracleParameter("output_id", OracleDbType.Int32, ParameterDirection.Output); // 执行PL/SQL块 conn.Execute(sql, new { output_id = outputParam }); // 获取最终输出值 var id = (int)outputParam.Value;
方案2:返回结果集(适合单个输出值的简单场景)
调整PL/SQL代码
在PL/SQL块的最后,通过SELECT语句把变量作为结果集返回给客户端:
DECLARE var_zi_controle_id NUMBER; BEGIN -- 你的原有业务逻辑 INSERT INTO your_table (col1, col2, ...) VALUES (... ,NULL /*CLIENTE_GRUPO_CPF*/ ,'P' /*LOTE_PRODUCAO_PEDIDO*/ ,'N' /*LIBERACAO_COMERCIAL*/ ,NULL /*USUARIO_LIB_COMERCIAL*/ ,NULL /*DATA_LIB_COMERCIAL*/ ,NULL /*HORA_LIB_COMERCIAL*/ ,'L' ) RETURNING zi_controle_id INTO var_zi_controle_id; COMMIT; -- 将变量作为结果集返回给客户端 SELECT var_zi_controle_id AS result_id FROM dual; END;
C#代码(用Dapper查询结果集)
这时你原来的QueryFirstOrDefault写法就能正常工作了:
var id = conn.QueryFirstOrDefault<int>(sql);
注意事项
- 确保你的PL/SQL逻辑正确给
var_zi_controle_id赋值了(比如用RETURNING ... INTO获取插入后的ID,或者其他业务逻辑赋值)。 - 如果使用OUT参数,必须使用Oracle官方驱动的
OracleParameter,不能用Dapper的默认参数类型,因为要指定Oracle特定的参数类型和方向。
内容的提问来源于stack exchange,提问作者João Rafael Colombo
相关产品推荐
相关产品推荐

