Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Oracle ORA-06502 PL/SQL:数字或值错误:字符到数字转换错误_C#_Oracle_Odp.net - Fatal编程技术网

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

C# Oracle ORA-06502 PL/SQL:数字或值错误:字符到数字转换错误,c#,oracle,odp.net,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 = Com

我知道有很多这样的事情,我基本上都经历过了,但我似乎找不到解决我问题的答案

我有一个功能如下的包:

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行

在调试中,我可以看到
Param1
Param2
ReturnValue
varchar2
ANumber
是Int32。即使我将一个成员更改为Int64,它仍然不起作用,我也不确定为什么会出现这个错误,因为一切似乎都很好。如果我犯了一个愚蠢的错误,有人能向我指出吗

如果我在蟾蜍身上执行这个,它会毫无问题地工作

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;

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

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

使用
decimal
而不是
int
;看


我也试过了。我要尝试一下这个返回值优先的方法,我的话。这太好了,简直难以置信。现在出现了不同的错误,但这是因为varchar2的大小,我确信需要在ReturnValue上指定大小。感谢您的帮助。是的,out/return参数必须具有适当的大小,以支持所有返回值。对于其他参数,除非您设置command.BindByName=true,否则对其余参数的排序也很重要;然后是参数名。我猜这是有一些开销的。
 cmd.Parameters.Add("ANumber", 123m);