当前位置: 首页 > 知识库问答 >
问题:

ORA-06502:PL/SQL:从c#web服务调用存储过程时出现数字或值错误

申思远
2023-03-14

我正在尝试编写一个调用oracle存储过程的web服务。该过程有两个输入-一个字符串(公司代码)和一个int(客户代码)。它有2个输出参数;一个数字(pout_addr_code)和一个varchar2(pout_descr)。当我从sqldeveloper运行这个过程时,一切正常,两个值都按预期返回。当我从C#web服务调用该过程时,我在执行时(而不是在编译期间)得到错误“Oracle.DataAccess.Client.OracleException:ORA-06502:PL/SQL:numeric or value error”。

如果我评论了cmd。并返回pout_addr_code。值...行它将运行良好,并输出我的测试字符串。

如果我从过程中删除varchar2输出,并注释掉添加pout_descr参数的部分,注释掉返回“我返回......”它运行正常,包括从存储过程返回值。

因此,在我看来,问题在于当过程具有OracleDbType时执行NonQuery。Varchar2线。当使用Oracle在C#中添加输出参数时,是否有其他方法来定义这一点。DataAccess引用?我发现这篇文章询问了一个类似的错误,但他的解决方案是“在C#中指定VARCHAR2到32767的最大值”,但我不明白你是如何做到的。

这是我的c#代码:

public string AutoPmtPost(string company_code, int customer_code)
    {
        string oradb = "Data Source=MySource; User Id=MyID; Password=MyPassword;";
        OracleConnection conn = new OracleConnection(oradb);
        conn.Open();
        OracleCommand cmd = new OracleCommand("USP_JEFF_TEST", conn);
        cmd.CommandType = CommandType.StoredProcedure;

        cmd.Parameters.Add("pin_company_code", OracleDbType.Varchar2, ParameterDirection.Input).Value = company_code;

        cmd.Parameters.Add("pin_customer_code", OracleDbType.Int32, ParameterDirection.Input).Value = customer_code;

        OracleParameter pout_addr_code = new OracleParameter("pout_addr_code", OracleDbType.Int32);
        pout_addr_code.Direction = ParameterDirection.Output;
        cmd.Parameters.Add(pout_addr_code);

        OracleParameter pout_descr = new OracleParameter("pout_descr", OracleDbType.Varchar2);
        pout_descr.Direction = ParameterDirection.Output;
        cmd.Parameters.Add(pout_descr);

        cmd.ExecuteNonQuery();
        //return pout_addr_code.Value.ToString();
        return "I returned something";
    }

谢谢。

共有1个答案

西门飞星
2023-03-14
OracleParameter pout_descr = new OracleParameter("pout_descr", OracleDbType.Varchar2);

应该是

OracleParameter pout_descr = new OracleParameter("pout_descr", OracleDbType.Varchar2, 2000);
 类似资料:
  • 这里是我的过程中,我过滤4个参数的数据库: 开始日期、结束日期、小时和分钟。 当我过滤数据之间2017-11-01到2017-11-30(与一个月)它的工作罚款,但当我过滤数据大于1个月,如2017-11-01到2017-12-10然后它给我的错误如下。 程序 错误 ORA-06502:PL/SQL:数字或值错误 ORA-06512:在"MYRENT. RENTEDTOTALCARS",第58行

  • 我有一小段代码,抓取一些数据并生成SQL语句,将它们插入Oracle数据库。然后通过Oracle服务器上的JDBC驱动程序执行这些操作。 我遇到的问题是,如果这些语句包含一个TO_BINARY_DOUBLE调用,它们总是对我失败,而不是对我团队中的任何人失败,他们应该和我有完全相同的驱动程序和环境,这是非常奇怪的。 错误是: 希望有人能给我提供一些线索,或者给我指出正确的方向,试着找到它。

  • 正如您所知,由于Oracle11g不支持json,我使用CLOB创建json数据,因为varchar2(32767)大小,但此时我得到了ORA-06502:PL/SQL:numeric或value错误。同时,数据大小为68075。为什么我得到错误,尽管Clob是支持4 gb的数据?

  • 我试图插入数据到Oracle数据库从ASP. NET MVC应用程序。我使用存储过程这样做,但我得到这个错误: ORA-06502:PL/SQL:数值或值错误:字符串缓冲区太小ORA-06512:在“C#AET.KATEGORIJA_PKG”第40行ORA-06502:PL/SQL:数值或值错误:字符串缓冲区太小ORA-06512:在第1行 程序代码为: 以及调用它的方法: 与数据库通信的方法有:

  • 我在执行触发器时遇到以下错误: 请说明问题的原因。 编辑 数据类型:

  • 我实现了一个返回clob数据类型的函数,我希望在DBMS输出中打印结果。不幸的是,我得到了ORA-06502:PL/SQL:numeric或value错误,我认为这是由于dbms_output的大小造成的。 这是密码。 这里有一些东西可以帮助您理解这个问题 1)添加了以下内容来设置缓冲区的大小不受限制,但不起作用… 3)我可以通过执行以下操作来解决这个问题,但我认为这不是一个好的解决方案,因为它执