我正在使用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
我不知道我在哪里做错了什么。
答案 0 :(得分:3)
OracleParameterCollection.Add
方法的重载次数不少于10次。看起来你不小心打错了。
我相信您想要的是Add(string, OracleDbType, int, object, ParameterDirection)
,在这种情况下,您只是缺少object
参数的值。此参数应包含您正在使用的Oracle参数的初始值。但是,在您的情况下,初始值无关紧要,因为它是out
参数。在null
之后添加50
,您的存储过程调用应该会成功。
你所呼叫的是Add(string, OracleDbType, object, ParameterDirection)
。大小50
已被解释为参数的初始值。我不确定如何解释Oracle返回的错误(“数字或值错误”) - 这对我来说意味着Oracle已经尝试将字符串转换为数字而失败了。也许值50
会覆盖类型OracleDbType.Varchar2
,因此Oracle期望数字而不是字符串?
我发现了另外两个问题:
command.Parameters["SP_REQ_NUM"]
应该command.Parameters["SP_NUM"]
吗?Convert.ToInt32
等字符串上调用201405 001
将失败。