En general, lo recomendable es que todas tus tablas estén en una sola Base de Datos ya que así puedes relacionar muy fácilmente a esas tablas entre sí. Sin embargo a veces no puedes evitar tener dos o más bases de datos. En ese caso: ¿cómo harías para insertar, modificar o borrar filas en una tabla que se encuentra en la otra Base de Datos?
El comando EXECUTE STATEMENT viene rápidamente en tu ayuda.
CREATE PROCEDURE INSERTAR_EN_BASEDATOS_EXTERNA_1 AS DECLARE VARIABLE lcComando VARCHAR(200); DECLARE VARIABLE lnIdenti BIGINT; DECLARE VARIABLE lcNombre VARCHAR(40); BEGIN lnIdenti = 0; lcNombre = '''Esta es una prueba'''; lcComando = 'INSERT INTO TARJETAS(TAR_IDENTI, TAR_NOMBRE) VALUES(' || :lnIdenti || ',' || :lcNombre || ')'; EXECUTE STATEMENT lcComando ON EXTERNAL 'E:\BASESDATOS\CONTABILIDAD.FDB' AS USER 'SYSDBA' PASSWORD 'masterkey'; END;
Como puedes ver la variable lcNombre está rodeada por tres apóstrofos ¿por qué eso? porque si no se hace así ocurre un error ya que el contenido de esa variable debe estar rodeado de apóstrofos en el comando INSERT INTO. Cuando quieres que dentro de un string aparezca un apóstrofo debes escribir dos apóstrofos seguidos. Por ese motivo tuve que escribir tres apóstrofos.
Quizás también hayas notado que aunque la variable lnIdenti es numérica se la concatenó sin necesidad de convertirla previamente a tipo carácter, esa es una gran facilidad que nos da el Firebird.
En este ejemplo, los valores que insertamos en las columnas TAR_IDENTI y TAR_NOMBRE son constantes, sin embargo lo más común es que necesitemos insertar valores variables, como se ve en el siguiente ejemplo:
CREATE PROCEDURE INSERTAR_EN_BASEDATOS_EXTERNA_2( tnIdenti BIGINT, tcNombre VARCHAR(40)) AS DECLARE VARIABLE lcComando VARCHAR(200); BEGIN lcComando = 'INSERT INTO TARJETAS(TAR_IDENTI, TAR_NOMBRE) VALUES(' || :tnIdenti || ',''' || :tcNombre || ''')'; EXECUTE STATEMENT lcComando ON EXTERNAL 'E:\BASESDATOS\CONTABILIDAD.FDB' AS USER 'SYSDBA' PASSWORD 'masterkey'; END;
En este ejemplo los datos a insertar en la tabla externa fueron enviados como parámetros al stored procedure. Fíjate bien como el parámetro :tcNombre está rodeado por apóstrofos. Debes escribir esos apóstrofos para que funcione.
Conclusión:
Para poder insertar, modificar o borrar filas en una tabla que se encuentra en otra Base de Datos debemos crear un string y luego ejecutarlo con el comando EXECUTE STATEMENT. Hay que tener en cuenta que las variables de tipo carácter deben estar rodeadas por apóstrofos.
Artículo relacionado:
El índice del blog Firebird21 | Firebird SQL
Jun 17, 2013 @ 04:44:56
mauricio
Abr 24, 2014 @ 22:22:43
Me gustaría saber, como puedo hacer un INSERT INTO … SELECT pero con distintas bases, es decir de forma de que el SELECT en una base, guarde en la otra (las bases son distintas, el nombre de la tabla igual).
wrov
Abr 24, 2014 @ 22:26:33
Directamente todavía no se puede porque son dos bases de datos, pero puedes escribir un stored procedure para lograrlo usando EXECUTE STATEMENT en él.
Saludos.
Walter.
mauricio
Abr 24, 2014 @ 22:39:16
Si el artículo https://firebird21.wordpress.com/2013/05/16/importar-datos-desde-otra-base-de-datos/ se parece bastante a lo que busco, con la diferencia que el camino sería a una base remota (se podrá cambia el path -‘E:\BASESDATOS\CONTABILIDAD.FDB’- a un camino con IP?)
wrov
Abr 24, 2014 @ 22:44:22
Sí, por supuesto que se puede escribir el IP.
Saludos.
Walter.
Jesús Chávez
Ene 21, 2017 @ 15:28:00
Hola!
busco la forma de que al insertar un registro (facturación) ese mismo registro se inserte en otra base de datos para generar unas estadísticas y jugar con los datos.
Es posible usar EXECUTE STATEMENT desde un trigger o que recomiendan?
Gracias!
wrov
Ene 21, 2017 @ 22:34:41
Sí, es posible, ningún problema.
Lo recomendable es que ese trigger sea AFTER INSERT
Saludos.
Walter.
juan candia
Mar 01, 2017 @ 13:59:57
es posible utilizar otro usuario para conectarse a la bd externa?,
yo lo hago en firebird 2.5 simplemente escribiendo el user y pass en luego del ON, pero en la otra bd me sigue respondiendo que no existe usuario y password definido.
wrov
Mar 03, 2017 @ 01:31:09
Sí, claro, los usuarios pueden ser distintos. No siempre ambas bases de datos tendrán los mismos usuarios.
Tienes que conocer un usuario y un password, (y quizás también un rol) de la Base de Datos externa para poder conectarte a ella.
Saludos.
Walter.
Raúl Velasco
Abr 05, 2018 @ 17:40:33
Hola que tal tengo un error un error , al hacer el ejercicio.
El cual dice algo asi de CAN´T FORMAT MESSAGE 13:393–message file