我正在编写的存储过程的一部分(在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可以为此工作,但只需将最小值和最大值返回到我的程序,然后在那里单独选择就更容易了。
答案 0 :(得分:5)
我不确定你是否需要循环。根据{{1}}类型的定义,您可能只需
ARRAY
答案 1 :(得分:3)
所以,你需要知道的是:
将它们组合成一个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#应用程序中的数组或集合但是你喜欢吗?