BULK收集INTO内部OPEN游标FOR SELECT ...不会填充集合

时间:2016-08-17 10:17:13

标签: oracle plsql

我有一个过程,它将游标作为输出参数返回。在SP内部,输出游标变量作为SELECT语句打开。我是将这个游标中的记录重用于SP中的以下逻辑,并使用BULK COLLECT子句将它们存储在嵌套表中。但是发现,没有任何异常,这个嵌套表没有被填充。 我写了一个简单的例子来说明这种行为:

create table temp_table as
select 1 as col1 from dual
union all
select 2 as col1 from dual;

declare
  v_cur sys_refcursor;
  v_rec temp_table%rowtype;
  procedure get_cursor(v_cur OUT sys_refcursor) is
    type typ_temp_tab_tab is table of temp_table%rowtype;
    v_tab typ_temp_tab_tab;
  begin
    v_tab:=typ_temp_tab_tab();
    open v_cur for 
      select * 
      bulk collect into v_tab
        from temp_table;
    dbms_output.put_line('nested table''s records num: '||v_tab.count);
  end;
begin
  get_cursor(v_cur);
  dbms_output.put_line('values in cursor: ');
  loop
    fetch v_cur into v_rec;
    exit when v_cur%NOTFOUND;
    dbms_output.put_line('>>'||v_rec.col1);   
  end loop;
end;
/
drop table temp_table;

输出是:

nested table's records num: 0
values in cursor: 
>>1
>>2

您是否知道为什么它不起作用?在SP中重复使用光标记录的最佳做法是什么?

1 个答案:

答案 0 :(得分:4)

你不会写:

open v_cur for 
      select * 
      bulk collect into v_tab
        from temp_table;

你只需要:

  select * 
  bulk collect into v_tab
    from temp_table;

否" open v_cur for"。

不幸的是,我认为这意味着你不能同时拥有(A)嵌套表中的数据和(B)将打开的游标返回给调用者而不运行查询两次。 Oracle必须获取游标中的所有行才能执行BULK COLLECT,之后光标将无法传回给调用者。