Ver Mensaje Individual
  #2 (permalink)  
Antiguo 02/02/2009, 08:47
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: Cursor tarda mucho en ejecutarse

El fetch de los cursores ya es conocido por ser problemático, hay dos opciones que puedes probar.

Opcion 1. Un insert sin utilizar un cursor, esta es sin dudas, la más rápida.

Código:
create table t1 (id number(8), datos1 varchar2(30))
/
/* insert into con el select con las 30 funciones */
insert into t1
select 1,to_char(1)) from dual
/
Opción 2. En caso que sea necesario un cursor por algún tipo de procesamiento intermedio antes de hacer el insert, está la forma del bulk collect.

Código:
create table t1 (id number(8), datos1 varchar2(30))
/
declare

 /* select con las 30 funciones */
 cursor c1 is 
  select 1 as id, to_char(1) as datos1
  from dual;

 /* tipo de dato tabla con el formato del cursor*/
 type type_t1 is table of c1%rowtype index by pls_integer;
 t type_t1;

begin

 open c1;
 loop

  /* limite de registros por cada bulk collect, esto es para no consumir toda la PGA*/
  fetch c1 bulk collect into t limit 100;
  exit when t.count = 0;

  /* loop que los datos que tengas que procesar*/
  for i in t.first..t.last loop
    insert into t1 (id, datos1) values (t(i).id, t(i).datos1);
  end loop;
  
 end loop;

end;
/
Saludos