如何在存储过程中循环遍历数组,返回数组?

时间:2011-08-05 15:03:22

标签: c# arrays oracle stored-procedures

我正在编写的存储过程的一部分(在Oracle DB上)将向c#app返回一个整数值数组。我之前从未这样做过,我无法在线查找有关如何在存储过程中执行此操作的信息。

在C#端,我已连接到DB并创建了存储过程命令。我正在使用:

cmd.Parameters.Add("returnID", OracleDbType.Array, ParameterDirection.Output);

抓住阵列。

在存储过程中,我有:

CREATE OR REPLACE PROCEDURE ODM(/* not relevant*/, returnIDs OUT ARRAY)
IS
BEGIN
...
END ODM;

其中returnIDs是我想要输出的数组,其中包含整数。

我需要能够遍历表ORDERS,并获取两个值之间的所有整数主键,并将它们添加到returnID中。

我希望theres soemthing类似于插入到数组中,其中主键位于最小值和最大值之间,但我不确定。

能够声明这些值的语法是什么,循环遍历表并添加到我的输出数组中?

编辑:解决方案:Bulk Collect可以为此工作,但只需将最小值和最大值返回到我的程序,然后在那里单独选​​择就更容易了。

3 个答案:

答案 0 :(得分:5)

我不确定你是否需要循环。根据{{​​1}}类型的定义,您可能只需

ARRAY

答案 1 :(得分:3)

所以,你需要知道的是:

  1. 我们可以使用Oracle的bulk collect语法
  2. 插入数组
  3. 我们可以使用the ROW_NUMBER() aggregate function为每一行指定唯一编号。
  4. 将它们组合成一个PL / SQL函数,如下所示:

    SQL> create or replace type numbers_nt as table of number
      2  /
    
    Type created.
    
    SQL> create or replace function get_range_of_numbers
      2    (p_start in pls_integer
      3      , p_end in pls_integer )
      4     return  numbers_nt
      5  is
      6    rv numbers_nt ;
      7  begin
      8      select empno
      9      bulk collect into rv
     10      from
     11          ( select empno
     12                   , row_number() over (order by empno asc) rn
     13            from emp )
     14      where rn between p_start and p_end;
     15      return rv;
     16  end;
     17  /
    
    Function created.
    
    SQL> 
    

    让我们摇滚吧!

        SQL> select *
          2  from table(get_range_of_numbers(5, 8))
          3  /
    
        COLUMN_VALUE
        ------------
                7654
                7698
                7782
                7788
    
        SQL>
    

    嗯,我想我误解了你的问题。您可能希望根据键值而不是行位置选择记录。在这种情况下,该功能应该只是

    create or replace function get_range_of_numbers
      (p_start in pls_integer
        , p_end in pls_integer )
       return  numbers_nt 
    is
      rv numbers_nt ;
    begin
        select empno
        bulk collect into rv
        where emp between p_start and p_end;
        return rv;
    end;
    /
    

答案 2 :(得分:-1)

我的数据库专业知识主要在sql server和firebird中,我不是一个熟练的oracle人。但是,我只是好奇,你不能只选择值并将它们作为一个简单的数据表或数据集返回到C#应用程序然后你可以将它们保存在数据表中或将它们转换为C#应用程序中的数组或集合但是你喜欢吗?