Oracle ORA-06502 PL/SQL:数字或值错误:字符到数字的转换错误

Posted

技术标签:

【中文标题】Oracle ORA-06502 PL/SQL:数字或值错误:字符到数字的转换错误【英文标题】:Oracle ORA-06502 PL/SQL: numeric or value error: character to number conversion error 【发布时间】:2015-09-28 09:10:20 【问题描述】:

我知道有很多这样的事情,而且我基本上都经历了所有这些事情,但我似乎无法找到我的问题的答案。

我有一个功能如下的包:

FUNCTION AFunction(AString1 varchar2, ANumber NUMBER, AString2 VARCHAR2) RETURN VARCHAR2 AS

C# 我执行它就像

using (var cmd = new OracleCommand("SCHEMA.MYPACKAGE.AFunction", conn))

    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.Add("AString1", "Param1");
    cmd.Parameters.Add("ANumber", 123);
    cmd.Parameters.Add("AString2", "Param2");
    cmd.Parameters.Add("ReturnValue", OracleDbType.Varchar2).Direction = ParameterDirection.ReturnValue;

    cmd.ExecuteNonQuery();

附加信息:ORA-06502:PL/SQL:数字或值错误:字符到数字的转换错误 ORA-06512: 在第 1 行

在调试中,我可以看到 Param1Param2ReturnValuevarchar2ANumber 是 Int32。即使我将 ANumber 更改为 Int64,它仍然无法正常工作,而且我不确定为什么会出现此错误,因为一切看起来都很好。如果我犯了一个愚蠢的错误,有人可以指出我吗?

如果我在 toad 中执行它,它可以正常工作。

DECLARE 
  RetVal VARCHAR2(200);
  PARAM1 VARCHAR2(4000);
  PARAM2 VARCHAR2(100);
  ANUMBER NUMBER;

BEGIN 
  PARAM1 := 'AParam1';
  ANUMBER := 123;
  PARAM2 := 'AParam2';

  RetVal := SCHEMA.MYPACKAGE.AFunction ( PARAM1, ANUMBER, PARAM2 );
  COMMIT; 
END;

【问题讨论】:

【参考方案1】:

调用函数时,返回参数必须是集合中的第一个参数,所以

using (var cmd = new OracleCommand("SCHEMA.MYPACKAGE.AFunction", conn))

    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.Add("ReturnValue", OracleDbType.Varchar2).Direction = ParameterDirection.ReturnValue;
    cmd.Parameters.Add("AString1", "Param1");
    cmd.Parameters.Add("ANumber", 123);
    cmd.Parameters.Add("AString2", "Param2");

    cmd.ExecuteNonQuery();

【讨论】:

我的话。这几乎好得令人难以置信。现在不同的错误,但这是因为我确定 varchar2 的大小 需要在 ReturnValue 上指定大小。感谢您的帮助。 是的,输出/返回参数必须具有适当的大小以支持所有返回值。 对于其他人来说,订单对其余参数也很重要,除非您设置 command.BindByName=true;然后它按参数名称。我的猜测是这有一些开销。【参考方案2】:

使用decimal 代替int;见Which .NET data type is best for mapping the NUMBER Oracle data type in NHibernate?。

 cmd.Parameters.Add("ANumber", 123m);

【讨论】:

我也试过了。我将快速尝试这种 ReturnValue 第一种方法

以上是关于Oracle ORA-06502 PL/SQL:数字或值错误:字符到数字的转换错误的主要内容,如果未能解决你的问题,请参考以下文章

Oracle ORA-06502 PL/SQL:数字或值错误:字符到数字的转换错误

Oracle 存储过程无法生成 csv 文件 - ORA-06502: PL/SQL: numeric or value error: string buff

Oracle.DataAccess.Client.OracleException ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太小。 ExecuteReader 步骤出错

PL/SQL - 防止 ORA-06502

ORA 06502 错误 PL/SQL

PL/SQL: 数字或值错误 - ORA-06502