.net 4.5 中的 Oracle 存储过程

标签 oracle .net-4.5 odac

我正在尝试在 .net 4.5 中执行以下存储过程

 PROCEDURE my_procedure ( 
      a_cursor          OUT t_cursor,
      return_value      OUT VARCHAR2,
      a_type                VARCHAR2,
      a_time                DATE,
      a_id                  VARCHAR2,
      a_arg1                VARCHAR2,
      a_from                VARCHAR2,
      a_gl2                 VARCHAR2,
      a_arg2                DATE DEFAULT NULL,
      a_templ               VARCHAR2 DEFAULT NULL 
      )

这些参数中的大多数都可以为空。在蟾蜍中我可以执行它:

BEGIN package.my_procedure( :c, :out, 'arg', '', '123' , '', '', '', '', ''); END;

在 C# 中,我正在尝试以下操作:

object[] parameters = {
         new OracleParameter("arg1", arg1),
         new OracleParameter("arg", "arg"),
         new OracleParameter("empti", ""),
         new OracleParameter("out", OracleDbType.Varchar2, ParameterDirection.Output),
         new OracleParameter("c", OracleDbType.RefCursor, ParameterDirection.Output)
                                      };

     const string sql = "BEGIN package.my_procedure  
          (:c, :out, :arg, :empti, :arg1 , :empti, :empti, :empti, :empti, :empti); END;";
     res = _projectRepository.ExecuteStoredProcedure(sql, parameters);

我收到以下错误

Test method Tests.repository.RepositoryTests.TestMethod1 threw exception: 
Oracle.DataAccess.Client.OracleException: ORA-06550: 
line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'my_procedure'ORA-06550: 
line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'my_procedure'ORA-06550: 
line 1, column 7:
PL/SQL: Statement ignored

我尝试过使用和不使用可选参数以及使用/不使用 return_value/:out 参数。

我正在使用 Oracle.DataAccess 提供程序 v. 4.112.3.0。它可以与其他没有那么多参数/只有一个输出参数(光标)的存储过程一起使用。

编辑:我发现一个错误,我需要将输出参​​数放在参数数组中;

new OracleParameter("c", OracleDbType.RefCursor, ParameterDirection.Output),
                    new OracleParameter("out", OracleDbType.Varchar2, ParameterDirection.Output),
                    new OracleParameter("arg1", "arg1"),
                    new OracleParameter("empti", ""),
                    new OracleParameter("arg", arg),
                                      };

现在我收到错误:

ORA-06502: PL/SQL: numeric or value error: character string buffer too small

似乎是一个数据库错误,但看起来很奇怪,因为我可以从蟾蜍执行相同的命令而不会收到错误。

最佳答案

当使用VARCHAR2作为OUPUT时,您需要提供字符缓冲区的大小。不过,构造函数重载在这里没有帮助,您需要手动创建变量来设置所需的属性。

// Specify a size adequate for the full return value.
OracleParameter returnValue =
  new OracleParameter("return_value", OracleDbType.Varchar2, 100);
returnValue.ParameterDirection = ParameterDirection.Output;

object[] parameters = {
  returnValue,
  // other parameters here
};

原版

我将保留原来的答案,因为它解决了问题的第一个版本。

提供的错误是正确的,您在调用中没有提供正确数量的参数。让我们看一下 Toad for Oracle 可以使用的原始工作代码,并将它们映射到参数名称:

BEGIN
  package.my_procedure(a_cursor     => :c,
                       return_value => :out,
                       a_type       => 'arg',
                       a_time       => '',
                       a_id         => '123',
                       a_arg1       => '',
                       a_from       => '',
                       a_gl2        => '',
                       a_arg2       => '',  -- DEFAULT NULL
                       a_temp1      => ''); -- DEFAULT NULL
END;

请注意,在 Toad for Oracle 中,您甚至为声明为 DEFAULT NULL 的参数提供值(这不是问题)。

如果您查看参数列表,您会发现您正在为 arg1argempti 提供绑定(bind)>outp。您可以按如下方式放置它们以匹配:

a_cursor     => :c     -- you created the OracleParameter as 'p', not 'c'
return_value => :out  
a_type       => :arg
a_time       => :empti
a_id         => :arg1
a_arg1       => :empti
a_from       => :empti
a_gl2        => :empti
a_arg2       => :empti
a_temp1      => :empti

Oracle 提示参数数量不匹配,这是因为您将引用游标参数声明为 p 而不是 c。您需要将 OracleParamter 更新为 c 的名称,或者将正在执行的 PL/SQL 第一个参数更改为 :p

关于.net 4.5 中的 Oracle 存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11523466/

相关文章:

c# - 通过部分匹配名称来查找多个控件

c# - 获取 "cannot insert NULL into ("架构"."table"."column") 当列不为空时

java - 找不到适合 jdbc 的驱动程序

oracle - 计算两个选择计数的百分比

C# 如何捕获泛型抽象类构造函数的异常

c# - .net 4.5 中是否有类似 dbgeometry makevalid 的东西

c# - ODAC/Oracle 等同于 Linq to Entities GroupBy FirstOrDefault

oracle - 安装 Oracle ODAC 12c 第 4 版 (12.1.0.2.4) 时出现错误 PRVF-7536

oracle - 比较 VARCHAR2 与 CHAR 的最佳方式

sql - 如何以线性方式将 IN 子句中的值列表与另一个 IN 子句进行匹配