PL SQL:如何在循环中填充游标

时间:2016-08-04 08:12:47

标签: oracle11g

我有一个方案来实现我们将拥有一个带有两个参数的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

请建议热点在此场景中填充光标

1 个答案:

答案 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;
/