我如何在oracle中将参数作为varchar2输出

我正在使用oracle 10g

这是我的包装规格和正文

CREATE OR REPLACE PACKAGE P_1 AS TYPE T_CURSOR IS REF CURSOR; PROCEDURE USP_1(SP_NUM OUT VARCHAR2); END P_1; CREATE OR REPLACE PACKAGE BODY P_1 AS PROCEDURE USP_1(SP_NUM OUT VARCHAR2) IS BEGIN SELECT to_char(concat(to_char(sysdate, 'yyyymm'), to_char("ActionId".nextval, '000'))) INTO SP_NUM FROM dual; END USP_1; END P_1; 

我的后端代码是

 using (OracleConnection oracleConnection = new BaseRepository().Connection) { oracleConnection.Open(); OracleCommand command = new OracleCommand("P_1.USP_1", oracleConnection); command.CommandType = System.Data.CommandType.StoredProcedure; command.Parameters.Add("SP_NUM", OracleDbType.Varchar2, 50, System.Data.ParameterDirection.Output); command.ExecuteNonQuery(); // exception arises at this line var Number = Convert.ToInt32(command.Parameters["SP_REQ_NUM"].Value.ToString()); 

这是我得到的例外。

 ORA-06502: PL/SQL: numeric or value error 

我不知道我在做错什么。

OracleParameterCollection.Add方法的重载次数不少于10次。 看起来你不小心打错了。

我相信你想要的是Add(string, OracleDbType, int, object, ParameterDirection) ,在这种情况下你只是缺少object参数的值。 此参数应包含您正在使用的Oracle参数的初始值。 但是,在您的情况下,初始值无关紧要,因为它是一个out参数。 在50之后添加null并且您的存储过程调用应该成功。

你调用的是Add(string, OracleDbType, object, ParameterDirection) 。 大小50已被解释为参数的初始值。 我不确定如何解释Oracle返回的错误(“数字或值错误”) – 这对我来说意味着Oracle已经尝试将字符串转换为数字而失败了。 也许值50会覆盖OracleDbType.Varchar2类型,因此Oracle期望数字而不是字符串?

我找到了另外几个问题:

  • 应该command.Parameters["SP_REQ_NUM"]command.Parameters["SP_NUM"]
  • 您的存储过程不返回数字; 在诸如201405 001类的字符串上调用Convert.ToInt32将失败。