Oracle ORA-06502 PL/SQL: numeric or value error: character to number conversion error
Oracle ORA-06502 PL/SQL: numeric or value error: character to number conversion error
我知道有很多这样的事情,我基本上都经历过,但我似乎找不到问题的答案。
我有一个功能如下的包:
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 行
在 Debug 中我可以看到 Param1
、Param2
和 ReturnValue
是 varchar2
而 ANumber
是 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;
调用函数时,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();
}
使用decimal
代替int
;参见 Which .NET data type is best for mapping the NUMBER Oracle data type in NHibernate?。
cmd.Parameters.Add("ANumber", 123m);
我知道有很多这样的事情,我基本上都经历过,但我似乎找不到问题的答案。
我有一个功能如下的包:
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 行
在 Debug 中我可以看到 Param1
、Param2
和 ReturnValue
是 varchar2
而 ANumber
是 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;
调用函数时,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();
}
使用decimal
代替int
;参见 Which .NET data type is best for mapping the NUMBER Oracle data type in NHibernate?。
cmd.Parameters.Add("ANumber", 123m);