我有一个过程,它将游标作为输出参数返回。在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中重复使用光标记录的最佳做法是什么?
答案 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
,之后光标将无法传回给调用者。