A veces en nuestra Base de Datos actual no están todos los datos que necesitamos pues algunos se encuentran en otras bases de datos. ¿Podemos consultar esas otras bases de datos?
La respuesta es sí y la forma de hacerlo es mediante el comando EXECUTE STATEMENT. Sin embargo hay dos puntos importantes que debes recordar:
- El Firebird no valida que el EXECUTE STATEMENT sea correcto antes de ejecutarlo, por lo tanto eres tú quien debe asegurarse de ello
- El EXECUTE STATEMENT es lento (a veces puede ser demasiado lento)
Los dos puntos anteriores implican que debes sopesar bien si vale la pena usar el EXECUTE STATEMENT o si mejor sería pensar en otra alternativa.
Ejemplo:
En una Base de Datos llamada ERP2000.FDB tenemos una tabla llamada CARGOS que tiene estas filas:
Captura 1. Si haces clic en la imagen la verás más grande
La columna CAR_IDENTI es el identificador del cargo, se usa internamente para referenciar a otras tablas con esta tabla. La columna CAR_CODIGO es la que se le muestra a los usuarios, ellos nunca ven la columna CAR_IDENTI ¿por qué? porque no necesitan verla, es para uso interno.
En otra Base de Datos, llamada BLOG_DB.FDB queremos ver las filas de la tabla CARGOS de ERP2000.FDB, para eso en BLOG_DB.FDB escribimos el siguiente stored procedure seleccionable:
SET TERM ^ ; CREATE PROCEDURE OBTENER_CARGOS RETURNS( ftnCodSuc SMALLINT, ftnIdenti INTEGER, ftcCodigo CHAR(4), ftcNombre VARCHAR(25)) AS DECLARE VARIABLE lcComando VARCHAR(256); BEGIN lcComando = 'SELECT CAR_CODSUC, CAR_IDENTI, CAR_CODIGO, CAR_NOMBRE FROM CARGOS' ; FOR EXECUTE STATEMENT lcComando ON EXTERNAL 'E:\SQL\SQL_CONTA\DATABASES\ERP2000.FDB' AS USER 'SYSDBA' PASSWORD 'masterkey' INTO :ftnCodSuc, :ftnIdenti, :ftcCodigo, :ftcNombre DO BEGIN SUSPEND; END END^ SET TERM ; ^
Y después de escribir este comando:
SELECT * FROM OBTENER_CARGOS
este será el resultado que obtendremos:
Captura 2. Si haces clic en la imagen la verás más grande
donde, como puedes ver, están todas las filas de la tabla CARGOS aunque los nombres de las columnas difieren porque los nombres de ellas son los que elegimos como parámetros de salida en nuestro stored procedure.
Conclusión:
Es perfectamente posible consultar bases de datos externas con Firebird pero como esa consulta se realiza con el comando EXECUTE STATEMENT a veces obtener los resultados puede demorar mucho tiempo por lo tanto debes verificar que la velocidad de respuesta esté dentro de los límites aceptables. En general si la tabla externa no tiene demasiadas filas no habría problemas. «Demasiadas filas» depende de tu hardware y de tu software, así que debes verificar.
Artículos relacionados:
Insertar, modificar o borrar filas en una Base de Datos externa
Importar datos desde otra Base de Datos
Mauricio Tanco
Mar 07, 2014 @ 08:48:34
Estoy buscando en Firebird lo que en Access se llama tabla VINCULADA, es la relación directa con una tabla, alojada en otra base de datos. Lo trabaja de forma tan simple, que no lo consigo en otras bases de datos y es fundamental para mi. Así que te agradezco cualquier info al respecto. GRACIAS!
En Firebird, el manejo de base de datos externas no lo simplifica mucho.
En MySQL lei que lo más parecido podría ser «El motor FEDERATED, aunque no es muy versátil, puede resultar útil, por ejemplo, para conectarnos directamente a una tabla en otro servidor MySQL sin necesidad de un intermediario»
wrov
Mar 07, 2014 @ 10:43:04
Recién Firebird 3.0 tendrá la posibilidad de trabajar con varias bases de datos al mismo tiempo. Por ahora, lo que puedes hacer es conectarte con otras bases de datos y realizar operaciones en ellas pero de una forma digamos «forzada». Funciona, pero es más lento de lo que debería. Puedes leer estos artículos:
Puedes hacer pruebas para verificar si la velocidad que obtienes es aceptable para tí y tus usuarios.
Saludos.
Walter.
Mauricio Tanco
Mar 07, 2014 @ 17:17:58
Walter muchas gracias por la respuesta.
Esperaremos entonces, creo que la versión 3 sigue en Alpha 2 y en según lo que leí esta por salir la Beta en estos días (http://www.firebirdsql.org/en/roadmap/).
Si tienes más adelante alguna idea, de como tratará este tema la v3 por favor avísanos.
Saludos…. Mauricio.
wrov
Mar 07, 2014 @ 19:18:12
Sí, ni lo dudes que apenas se libere la versión 3 todas sus nuevas características merecerán artículos de este blog.
Saludos.
Walter.
Fernando Arbach
Abr 27, 2016 @ 21:00:10
Walter como siempre muy bueno tu BLOG, finalmente gracias a esto pude resolver un problema que tenia para referencias datos de una tabla externa, el tema es que esto lo necesito para un JOIN y realmente la consulta tarda 10 veces mas que lo normal.
La pregunta es, podria copiar el resultado del PROCEDURE a una tabla temporal y con ella hacer un JOIN? Me darias un ejemplo?
Muchas Gracias!
wrov
Abr 28, 2016 @ 15:03:44
Sí, desde luego que se puede copiar el resultado de un stored procedure en una tabla, sea temporal o permanente.
Si el stored procedure es seleccionable entonces para el Firebird los resultados que produce son equivalentes a las filas de una tabla.
Saludos.
Walter.
Luis Gerardo Carrillo
Mar 31, 2017 @ 20:50:26
Walter
Sabes tu cual sera el tamaño maximo que se puede poner en la variable lcComando, ya que la consulta que deseo hacer a una tabla externa es de 2350 caracteres exactamente.
Saludos
Luis Gerardo Carrillo
Mar 31, 2017 @ 21:05:37
Ya lo resolvi, no era problema de la longitud, tenia un error en la sentencia SQL
Saludos Walter
wrov
Abr 03, 2017 @ 21:00:13
El tipo de datos VARCHAR acepta hasta 32765 caracteres en Firebird.
Saludos.
Walter.