Una corrección al comentario de huesos52, los datos del bulk collect se almacenan en la PGA y solo están disponibles para la sesión que los crea.
Sh3r3z4d4, la idea es, dentro de un cursor, el fetch es la acción que recorre y sube los registros a memoria, y se puede definir de dos formas:
1. Un registro por cada fetch, tiene buen rendimiento con pocos registros y el código es más simple.
2. Múltiples registros por cada fetch (bulk collect), el código es un poco más complejo pero tiene mejor rendimiento con muchos registros.
Código:
--una tabla t1
create table t1 (id number(8), datos varchar2(30));
Código:
--ej. bulk collect
--en cada fetch se suben 100 registros a memoria
declare
cursor c1 is select id, datos from t1;
type type_t1 is table of c1%rowtype index by pls_integer;
t type_t1;
begin
open c1;
loop
fetch c1 bulk collect into t limit 100;
exit when t.count = 0;
for i in t.first..t.last loop
--proceso de registros
end loop;
end loop;
end;
/
Código:
--ej. tradicional
--en cada fetch se sube un registro
declare
cursor c1 is select id, datos from t1;
var_id number(8);
var_datos varchar2(30);
begin
open c1;
loop
fetch c1 into var_id, var_datos;
exit when c1%notfound
--proceso de registros
end loop;
end;
/
En cualquier caso, no necesitas de tablas temporales, como puedes ver en los dos ejemplos, la estructura de memoria para almacenar los registros del cursor es siempre una variable (type_t1 es un tipo de variable llamada collection).
Saludos