No encontré un ejemplo completo, así que ahí va el mío. Lo generé en transacciones autónomas con COMMIT cada 5000 registros. Cualquier duda pregunten.
*Actualizado 22/07/2016 la inserción de los 5000 registros queda en una transacción separada, lo que permite por un lado, generar un commit pequeño y por otro ver el progreso del script, ya que podemos ir chequeando como se va llenando la tabla destino. He modificado el numero de registros de 5000 a 10000, 15000, 20000, 25000 y 30000. Tuve resultados significativos entre los 5000 y los 20000. Luego los commits comenzaron a demorarse un poco con lo cual no ganaba nada mas allá de los 20000. No encontré demasiada documentación a este respecto, si alguien me puede aportar algo le estaré agradecido. Las pruebas se hicieron copiando tablas entre bases de 30 millones de registros y mas. Si bien el proceso es lento, no repercutió en la performance general del servidor. Se trata de bases de producción con muchos usuarios trabajando sobre la base de origen.
EXECUTE BLOCK
AS
DECLARE VARIABLE QUERY VARCHAR(5000);
DECLARE VARIABLE REGISTROS INTEGER;
DECLARE VARIABLE FLAG SMALLINT;
DECLARE VARIABLE FCAMPO1 VARCHAR(15);
DECLARE VARIABLE FCAMPO2 VARCHAR(15);
DECLARE VARIABLE FCAMPON VARCHAR(50);
BEGIN
REGISTROS=1;
FLAG=1;
IN AUTONOMOUS TRANSACTION DO DELETE FROM TABLALOCAL;
WHILE (FLAG=1) DO BEGIN
FLAG=0;
QUERY ='SELECT CAMPO1, CAMPO2, CAMPON
FROM TABLAORIGEN
ROWS '||:REGISTROS||' TO '||(:REGISTROS + 4999);
IN AUTONOMOUS TRANSACTION DO BEGIN
FOR
EXECUTE STATEMENT QUERY
ON EXTERNAL DATA SOURCE 'server:/ruta/base.gdb'
AS USER 'SYSDBA'
PASSWORD 'masterkey'
INTO :FCAMPO1, :FCAMPO2, :FCAMPON
DO BEGIN
FLAG=1;
INSERT INTO TABLALOCAL (CAMPO1, CAMPO2, CAMPON)
VALUES (:FCAMPO1, :FCAMPO2, :FCAMPON);
END
END
REGISTROS = REGISTROS + 5000;
END
END