【问题标题】:Oracle Data Access ORA-06512: character string buffer too smallOracle 数据访问 ORA-06512: 字符串缓冲区太小
【发布时间】:2014-08-20 20:31:13
【问题描述】:

当我打电话给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;

【问题讨论】:

  • 指定大小为 9999999999999999999 的目的是什么?
  • 确保 p_out_message 大小足够...

标签: c# oracle odp.net


【解决方案1】:

这显然不是你想要的,但似乎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 参数并使用标量返回值或表函数。

【讨论】:

  • 是的,确实如此。我什至尝试了新的 Oracle.ManagedDataAccess,但也失败了。
  • 这对我不起作用,但我不会反对,因为很明显它适用于某些人。
  • @dan:感谢您的评论。你能详细说明“不工作”的部分吗?也许您可以提出一个新问题,参考这个问题,也许我们可以找到适合您的方法。
  • @PatrickHofman 在尝试这两种解决方案时,我仍然得到ORA-06502: PL/SQL: numeric or value error: NULL index table key value
  • @dan 是否与您代码中的另一个问题有关。似乎与函数的内部代码有关。见here
猜你喜欢
  • 2014-10-08
  • 2014-04-24
  • 2019-09-13
  • 1970-01-01
  • 1970-01-01
  • 2012-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多