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

时间:2014-05-26 09:30:47

标签: c# oracle plsql

我正在使用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

我不知道我在哪里做错了什么。

1 个答案:

答案 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将失败。