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

C#调用带OUT参数的Oracle存储过程报ORA-06502错误求助

ORA-06502错误:C#调用Oracle带OUT参数存储过程报错解决方法

我已经研究过ORA-06502错误的相关讨论,但排查后仍未定位到代码问题。在C#中调用带OUT参数的Oracle存储过程时始终失败。

存储过程代码

CREATE OR REPLACE PROCEDURE test_sp(v_payload OUT VARCHAR2) AS
BEGIN
    v_payload := 'he2';
END;

该存储过程逻辑简单,在Oracle SQL Developer中可正常执行。

报错的C#代码

OracleCommand command = new OracleCommand("test_sp", con);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add(new OracleParameter("v_payload", OracleDbType.Varchar2, 32767, ParameterDirection.Output));
await command.ExecuteNonQueryAsync();

错误信息

ORA-06502: PL/SQL: 数值或值错误: 字符串缓冲区太小

解决方案

问题出在OracleParameter的构造函数使用错误,导致输出参数的缓冲区大小未被正确设置。以下是两种修正方式:

方式一:显式设置Size属性

OracleCommand command = new OracleCommand("test_sp", con);
command.CommandType = CommandType.StoredProcedure;
OracleParameter payloadParam = new OracleParameter("v_payload", OracleDbType.Varchar2);
payloadParam.Direction = ParameterDirection.Output;
payloadParam.Size = 32767; // 明确指定输出参数的缓冲区大小
command.Parameters.Add(payloadParam);
await command.ExecuteNonQueryAsync();

方式二:使用正确的构造函数重载

OracleCommand command = new OracleCommand("test_sp", con);
command.CommandType = CommandType.StoredProcedure;
// 构造函数重载:参数名、类型、大小、源列名(设为null)、参数方向
command.Parameters.Add(new OracleParameter("v_payload", OracleDbType.Varchar2, 32767, null, ParameterDirection.Output));
await command.ExecuteNonQueryAsync();

原因说明

你之前使用的构造函数调用存在参数顺序错误,Oracle数据访问组件中不存在(string, OracleDbType, int, ParameterDirection)的重载,第四个参数实际应为源列名而非参数方向。这导致你设置的32767并未被识别为缓冲区大小,参数默认使用了过小的缓冲区,最终触发ORA-06502错误。

内容的提问来源于stack exchange,提问作者Diskdrive

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 06:43:24