Tema: Bulk Collect
Ver Mensaje Individual
  #4 (permalink)  
Antiguo 13/01/2012, 18:43
Avatar de matanga
matanga
 
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 5 meses
Puntos: 85
Respuesta: Bulk Collect

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