我有一个方案来实现我们将拥有一个带有两个参数的SP 1)在Varchar2数组的参数中 2)光标 - 输出参数
我们只为每个在数组中传递的Value填充游标,这个打开/填充的游标将由Java使用。但是到目前为止我发现的是,如果我们必须处理一个数组,那么它必须使用循环来完成。
例如:
Capabilities
我们可以有这样的事吗
Open Cursor_Name
For
For index In Arrar_Parameter.FIRST .. Arrar_Parameter.LAST
LOOP
SELECT * FROM EMP WHERE EmpId = Arrar_Parameter[i] -------> This needs to be looped and not sure if this will work
END LOOP
请建议热点在此场景中填充光标
答案 0 :(得分:1)
假设您的数组参数是架构级varray
或嵌套表,您可以使用a table collection expression:
table_collection_expression允许您通知Oracle,应将collection_expression的值视为表,以便进行查询和DML操作。 collection_expression可以是子查询,列,函数或集合构造函数。无论其形式如何,它都必须返回一个集合值 - 即类型为嵌套表或varray的值。提取集合元素的过程称为集合取消。
这使用内置的varray
类型,但您可以替换自己的类型:
create procedure procedure_name (
array_parameter sys.odcivarchar2list, cursor_name out sys_refcursor
) as
begin
open cursor_name for
select e.*
from table (array_parameter) a
join emp e on e.empid = a.column_value;
end;
/
如果您愿意,也可以使用in
:
create procedure procedure_name (
array_parameter sys.odcivarchar2list, cursor_name out sys_refcursor
) as
begin
open cursor_name for
select *
from emp
where empid in (select column_value from table (array_parameter));
end;
/
如果是嵌套表,您还可以使用member of
语法:
create type my_varchar2_table as table of varchar2(30);
/
create procedure procedure_name (
array_parameter my_varchar2_table, cursor_name out sys_refcursor
) as
begin
open cursor_name for
select *
from emp
where empid member of array_parameter;
end;
/