После того, как курсор открыт, вы можете FETCH
из него, пока не достигнете, пока больше не будут получены данные.В этот момент или раньше, если вы закончите обработку данных, вы можете CLOSE
курсор.
declare
p_data sys_refcursor;
v_select varchar2(1000) := 'select * from dual';
type data_rec is record (dummy dual.dummy%type);
type data_tab is table of data_rec;
l_data data_tab;
begin
OPEN p_data FOR v_select;
LOOP
FETCH p_data BULK COLLECT INTO l_data LIMIT 100;
FOR r in 1 .. l_data.count LOOP
dbms_output.put_line(l_data(r).dummy);
END LOOP;
EXIT WHEN p_data%notfound;
END LOOP;
CLOSE p_data;
end;