Oracle数据访问ORA-06512:字符串缓冲区太小

本文关键字:缓冲区 字符串 数据 访问 ORA-06512 Oracle | 更新日期: 2023-09-27 18:19:03

当我调用GetTest时,我得到这个错误:

字符串缓冲区太小ORA-06512

我的c#方法:

public string GetTEST()
{
    using (var conn = new OracleConnection(System.Configuration.ConfigurationManager.ConnectionStrings["Dbconnection"].ConnectionString))
    {
        OracleCommand cmd = new OracleCommand("Package.GetTEST");
        cmd.BindByName = true;
        cmd.Connection = conn;
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add("P_OUT_MESSAGE", OracleDbType.Varchar2,1000,ParameterDirection.Output);
        cmd.ExecuteNonQuery();
        var t = cmd.Parameters["P_OUT_MESSAGE"].Value;
    }
}

Oracle过程:

PROCEDURE GetTEST
(
  P_OUT_MESSAGE    OUT VARCHAR2 
)
IS
BEGIN
  p_out_message := 'Un problème a été signalé pour votre propriété. Veuillez communiquer avec le Service de l''évaluation au 418 111-7878 ou à l''adresse test@tesst.com';
END;

Oracle数据访问ORA-06512:字符串缓冲区太小

这显然不是您想要的,但似乎ODP。.NET使用.NET端参数的长度作为out参数的长度…

这将解决您的问题:

cmd.Parameters.Add("P_OUT_MESSAGE", OracleDbType.Varchar2, 32767, "x".PadRight(500, 'x'), ParameterDirection.Output);

但是这样更好,虽然不完全正确,但它可以工作:

cmd.Parameters.Add("P_OUT_MESSAGE", OracleDbType.Clob, ParameterDirection.Output);

如果可能的话,最好避免使用out参数,而使用标量返回值或表函数。

程序的OUT参数必须使用5个参数。所以我在这里添加了null

cmd.Parameters.Add("P_OUT_MESSAGE", OracleDbType.Varchar2, 1000, null, ParameterDirection.Output)

对于4,它将1000作为对象值而不是大小