我用的是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
将失败。
关于c# - 我怎样才能在oracle中输出一个参数作为varchar2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23866998/