【问题标题】:ORA-06502, ORA-06512 Oracle stored procedure errorORA-06502, ORA-06512 Oracle 存储过程错误
【发布时间】:2015-06-11 00:20:42
【问题描述】:

这些是我尝试从我的 c# 代码执行存储过程时遇到的错误。

ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at "MYAPP.PRO_COMPANYSEARCH", line 28
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 1

我的 c# 代码如下所示:

using (var mCon = new OracleConnection(MyConnectionString))
{
    myCon.Open();

    using (OracleCommand myOracleCmd = myCon.CreateCommand())
    {
        myOracleCmd.CommandType = CommandType.StoredProcedure;
        myOracleCmd.CommandText = "PRO_COMPANYSEARCH";
        myOracleCmd.Parameters.Add("o_result_cur", OracleDbType.RefCursor, ParameterDirection.Output);
        myOracleCmd.Parameters.Add("o_sqlcode", OracleDbType.Int32, ParameterDirection.Output);
        myOracleCmd.Parameters.Add("o_sqlmsg", OracleDbType.Varchar2, ParameterDirection.Output);

        var reader = myOracleCmd.ExecuteReader();
        dtCompany.Load(reader);
        reader.Dispose();
    }
}

有3个输出参数,其中2个用于跟踪异常,另一个用于结果。

编辑:这是我的存储过程,(不敢相信我忘了发布它)

CREATE OR REPLACE
PROCEDURE PRO_COMPANYSEARCH (
    o_result_cur OUT SYS_REFCURSOR,
    o_sqlcode OUT NUMBER,
    o_sqlmsg OUT VARCHAR2)

IS
BEGIN
  o_sqlmsg  := 'SUCCESS';
  o_sqlcode := 0;
  OPEN o_result_cur FOR Select distinct irint, irname, irabbv, iropt From vw_issue;

EXCEPTION
WHEN NO_DATA_FOUND THEN
  o_sqlcode := SQLCODE * -1;
  o_sqlmsg  := 'NO DATA FOUND';
WHEN OTHERS THEN
  o_sqlcode := SQLCODE * -1;     --This is line 28, I removed unnecessary comments.
  o_sqlmsg  := SUBSTR(SQLERRM, 1, 200);
END PRO_COMPANYSEARCH;

【问题讨论】:

  • 我猜你的存储过程的第 28 行可能有助于识别问题。
  • 我发布了存储过程。
  • 我怀疑这是问题所在。通过从 pl/sql 块调用过程来运行独立测试,看看是否仍然出现错误。
  • 当我在 sql developer 中运行存储过程时,它工作正常,并运行查询。

标签: c# oracle stored-procedures


【解决方案1】:

我找到了答案,在 c# 代码中你还必须包含 varchar 的大小

using (var mCon = new OracleConnection(MyConnectionString))
{
    myCon.Open();

    using (OracleCommand myOracleCmd = myCon.CreateCommand())
    {
        myOracleCmd.CommandType = CommandType.StoredProcedure;
        myOracleCmd.CommandText = "PRO_COMPANYSEARCH";
        myOracleCmd.Parameters.Add("o_result_cur", OracleDbType.RefCursor, ParameterDirection.Output);
        myOracleCmd.Parameters.Add("o_sqlcode", OracleDbType.Int32, ParameterDirection.Output);
        myOracleCmd.Parameters.Add("o_sqlmsg", OracleDbType.Varchar2, ParameterDirection.Output);
        myOracleCmd.Parameters["O_sqlmsg"].Size = 255;

        myOracleCmd.ExecuteNonQuery();
        var myReader = ((OracleRefCursor)myOracleCmd.Parameters["o_result_cur"].Value).GetDataReader();


        dtCompany.Load(myReader);
    }
}

【讨论】:

  • 也可以一行写myOracleCmd.Parameters.Add("o_sqlmsg", OracleDbType.Varchar2, 255, null, ParameterDirection.Output);
  • @WernfriedDomscheit 谢谢他们建议与我合作的方式......就像对其他人的反馈一样
  • 这里有个小提示:注意使用 五参数 方法重载。我使用了myOracleCmd.Parameters.Add("o_sqlmsg", OracleDbType.Varchar2, 255, ParameterDirection.Output); 的四参数,但它不起作用。确保将˙null˙放在参数#4。
  • 你拯救了我的一天。
【解决方案2】:

在我的情况下,上面的答案几乎没有修改。

var output_result_string = new OracleParameter("OUTPUT_RESULT_STRING", 
OracleDbType.NVarchar2, xxx, ParameterDirection.Output);
output_result_string.Size = 2500;

【讨论】:

    【解决方案3】:
    using (OracleConnection connection = new OracleDbConnector().OracleConnection)
    
    using (OracleCommand cmd = connection.CreateCommand())
    {
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = "MyFunction";
        cmd.Parameters.Add("returnVal", OracleDbType.Varchar2, ParameterDirection.ReturnValue);
        cmd.Parameters["returnVal"].Size = 200;
        cmd.Parameters.Add("application", OracleDbType.Varchar2, "InputValue", ParameterDirection.Input);
        cmd.ExecuteNonQuery();
        string returnValue = cmd.Parameters["returnVal"].Value.ToString();
    }
    

    【讨论】:

      猜你喜欢
      • 2020-03-10
      • 1970-01-01
      • 2011-12-10
      • 2020-08-17
      • 2015-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-09
      相关资源
      最近更新 更多