我怎么能把参数varchar2在oracle

本文关键字:oracle varchar2 参数 怎么能 | 更新日期: 2023-09-27 18:05:23

我使用的是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

我不知道我哪里做错了

我怎么能把参数varchar2在oracle

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