c# - 我怎样才能在oracle中输出一个参数作为varchar2

标签 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

我不知道我哪里做错了。

最佳答案

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/

相关文章:

c# - ConnectionString 属性尚未初始化错误

oracle - ORA-12505,TNS :listener does not currently know of SID given in connect

arrays - 两个嵌套表集合之间的plsql差异

oracle - 获取 PL/SQL 中的本地过程列表

oracle - 第 4 行错误 : PL/SQL: SQL Statement ignored

c# - 在 C++ 和 C# 中使用递归求矩阵的行列式

c# - 如何使用组合框过滤列表框项目?

c# - 将位图转换为 8bpp 灰度输出作为 c# 中的 8bpp 彩色索引

sql - 检查plsql中的变量是否为空

oracle - PLSQL : syntax problems with trigger