【问题标题】:Call Oracle stored procedure with a record as parameter以记录为参数调用 Oracle 存储过程
【发布时间】:2011-01-22 17:09:47
【问题描述】:

是否可以调用记录类型为IN参数的Oracle存储过程?

在 Oracle 中我有一个记录定义:

TYPE R_InData_tab IS RECORD ( ... );
TYPE InData_tab IS TABLE OF R_InData_tab INDEX BY BINARY_INTEGER;

现在我想将此记录类型设置为参数:

PROCEDURE myProcedure (inRecord IN myPackage.InData_tab);

并从我的 C# 代码中调用此过程。

有人有想法吗?

谢谢

【问题讨论】:

    标签: c# oracle stored-procedures parameters record


    【解决方案1】:

    我认为您仅限于 OracleType 中定义的内置 Oracle 类型。如果是这样,您将不得不编写一个接受常规参数、构造类型值并调用原始过程的存储过程。

    【讨论】:

      【解决方案2】:

      您可以通过发送一个代码块作为语句来做到这一点(自从我使用 Oracle 以来已经有一段时间了,所以语法可能略有偏差:

      DECLARE
          param indata_tab;
      BEGIN
          FOR i IN 1 .. :field1%COUNT LOOP
               param(i).field1 := :field1(i);
               param(i).field2 := :field2(i);
          END LOOP;
          myProcedure(param);
      END;
      

      然后将 field1 和 field2 参数绑定到数组。

      【讨论】:

        【解决方案3】:

        如果您使用 Oracle Data Provider for .NET(ODP.NET),则绝对可以call the procedure directly 而不使用 erikkallen 建议的按摩。

        但是,我不确定这是否能解决您的问题。看起来您正在定义包含该过程的包中的类型。为了使用上面链接的方法,您的类型需要在数据库中创建为单独的对象,使用 DDL,如下所示:

        CREATE TYPE R_InData_tab AS OBJECT ( ... );
        CREATE TYPE InData_tab AS TABLE OF R_InData_tab;
        

        这可能需要对包进行一些细微的更改,因为不支持 INDEX BY 类型作为架构对象,因此需要使用嵌套表(或可变数组)。

        【讨论】:

          猜你喜欢
          • 2010-09-20
          • 2022-10-21
          • 2011-10-08
          • 1970-01-01
          • 2019-10-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多