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

时间:2015-09-28 09:10:20

标签: c# oracle odp.net

我知道有很多这些东西,我基本上已经完成了所有这些,而且我似乎无法找到问题的答案。

我有一个包含以下功能的包:

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;

2 个答案:

答案 0 :(得分:2)

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

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();
}

答案 1 :(得分:0)

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

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