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