如何在存储过程中循环遍历数组,返回数组
本文关键字:数组 遍历 返回 循环 过程中 存储 存储过程 | 更新日期: 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
所以,你需要知道的是:
- 可以使用Oracle的批量收集语法 插入到数组中。
- 我们可以使用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#应用程序,但你喜欢?