A veces tenemos una Base de Datos de Firebird que tiene datos que nos interesaría copiarlos en otra Base de Datos de Firebird.

Por ejemplo, los clientes que están en DB1 quisiéramos copiarlos en DB2.

Podemos conseguir eso con un stored procedure como el siguiente:

CREATE PROCEDURE IMPORTAR_CLIENTES
   RETURNS(
      ftnCodSuc SMALLINT;     -- Código de la Sucursal
      ftnIdenti BIGINT;       -- Identificador del Cliente
      ftcNombre VARCHAR(60);  -- Nombre del Cliente
AS
   DECLARE VARIABLE lcComando VARCHAR(128);
BEGIN

   lcComando = 'SELECT CLI_CODSUC, CLI_IDENTI, CLI_NOMBRE FROM CLIENTES';

   FOR EXECUTE STATEMENT lcComando
   ON EXTERNAL DATA SOURCE 'E:\MISDATOS\DATABASES\DB1.FDB'
   AS USER 'SYSDBA'
   PASSWORD 'masterkey'
   INTO
      :ftnCodSuc,
      :ftnIdenti,
      :ftcNombre
   DO BEGIN
      INSERT INTO CLIENTES
            (CLI_CODSUC, CLI_IDENTI, CLI_NOMBRE)
      VALUES(:ftnCodSuc , :ftnIdenti , :ftcNombre );
      SUSPEND;
   END
END

Los pasos son los siguientes:

  1. En la variable lcComando escribimos el SELECT que queremos obtener de la Base de Datos externa.
  2. Mediante un ciclo FOR EXECUTE STATEMENT obtenemos cada una de las filas. El contenido de las columnas CLI_CODSUC, CLI_IDENTI y CLI_NOMBRE lo copiamos en las variables ftnCodSuc, ftnIdenti y ftcNombre (eso es lo que hace la cláusula INTO)
  3. Realizamos el INSERT en la tabla CLIENTES de la Base de Datos interna, la normal
  4. El SUSPEND es opcional, se lo utiliza si queremos que a medida que se vayan insertando filas éstas sean mostradas al usuario. De esta manera para el usuario es más visual porque está viendo como se van insertando los clientes.
  5. Si usas el SUSPEND entonces este será un stored procedure seleccionable y para ejecutarlo deberás escribir: SELECT * FROM IMPORTAR_CLIENTES

Observaciones:

  1. Si no quieres insertar clientes sino solamente mostrarlos, eliminas la línea del INSERT … VALUES y ya está.
  2. En este ejemplo se asumió que la tabla se llama CLIENTES en ambas bases de datos y que las tres columnas tienen la misma definición en ambas bases de datos, si este no es el caso deberás adecuar las columnas para que puedan contener los datos insertados.

Artículos relacionados:

Entendiendo a los stored procedures

El índice del blog Firebird21

El foro del blog Firebird21