我如何在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
将失败。