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

本文关键字:数组 遍历 返回 循环 过程中 存储 存储过程 | 更新日期: 2023-09-27 18:04:32

我正在编写的存储过程的一部分(在Oracle DB上)将返回一个整数值数组到c#应用程序。我以前从未这样做过,我找不到在线信息关于如何在存储过程中做到这一点。

在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中。

我希望有类似的插入到数组,其中主键是最小和最大值之间的东西,但我不确定。

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

编辑:解决方案:批量收集将为此工作,但它更容易只是返回最小和最大值到我的程序,然后只是做一个单独的选择在那里。

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

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

SELECT primary_key
  BULK COLLECT INTO returnIDs
  FROM orders
 WHERE primary_key BETWEEN low_value AND high_value

所以,你需要知道的是:

  1. 可以使用Oracle的批量收集语法
  2. 插入到数组中。
  3. 我们可以使用ROW_NUMBER()聚合函数给每一行一个唯一的编号。

把它们放在一个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;
/

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