dblink — ejecuta una consulta en una base de datos remota
dblink(text connname, text sql [, bool fail_on_error]) returns setof record dblink(text connstr, text sql [, bool fail_on_error]) returns setof record dblink(text sql [, bool fail_on_error]) returns setof record
dblink ejecuta una consulta (normalmente un SELECT,
pero puede ser cualquier sentencia SQL que devuelva filas) en una base de datos remota.
Cuando se proporcionan dos argumentos text, el primero se busca primero
como el nombre de una conexión persistente; si se encuentra, el comando
se ejecuta en esa conexión. Si no se encuentra, el primer argumento
se trata como una cadena de información de conexión como para dblink_connect,
y la conexión indicada se realiza únicamente durante la duración de este comando.
connnameNombre de la conexión a utilizar; omite este parámetro para usar la conexión sin nombre.
connstr
Una cadena de información de conexión, como se describió anteriormente para
dblink_connect.
sql
La consulta SQL que deseas ejecutar en la base de datos remota,
por ejemplo select * from foo.
fail_on_errorSi es true (el valor por defecto cuando se omite), entonces un error lanzado en el lado remoto de la conexión hace que también se lance un error localmente. Si es false, el error remoto se reporta localmente como una NOTICE, y la función no devuelve ninguna fila.
La función devuelve las filas producidas por la consulta. Dado que
dblink se puede utilizar con cualquier consulta, está declarada
para devolver record, en lugar de especificar un conjunto de columnas
en particular. Esto significa que debes especificar el conjunto de columnas esperado
en la consulta llamadora; de lo contrario,
PostgreSQL no sabría qué esperar.
Aquí tienes un ejemplo:
SELECT *
FROM dblink('dbname=mydb options=-csearch_path=',
'select proname, prosrc from pg_proc')
AS t1(proname name, prosrc text)
WHERE proname LIKE 'bytea%';
La parte de “alias” de la cláusula FROM debe
especificar los nombres de las columnas y los tipos que devolverá la función.
(Especificar nombres de columnas en un alias es en realidad sintaxis SQL
estándar, pero especificar tipos de columnas es una extensión de PostgreSQL).
Esto permite que el sistema comprenda a qué debe expandirse el *,
y a qué se refiere proname en la cláusula WHERE,
antes de intentar ejecutar la función. En tiempo de ejecución, se lanzará un error
si el resultado real de la consulta desde la base de datos remota no
tiene el mismo número de columnas que se muestran en la cláusula FROM.
Sin embargo, los nombres de las columnas no necesitan coincidir, y dblink
tampoco insiste en coincidencias exactas de tipos. Tendrá éxito
siempre que las cadenas de datos devueltas sean entradas válidas para el
tipo de columna declarado en la cláusula FROM.
Una forma cómoda de usar dblink con consultas predeterminadas
es crear una vista.
Esto permite que la información del tipo de columna quede oculta en la vista,
en lugar de tener que detallarla en cada consulta. Por ejemplo,
CREATE VIEW myremote_pg_proc AS
SELECT *
FROM dblink('dbname=postgres options=-csearch_path=',
'select proname, prosrc from pg_proc')
AS t1(proname name, prosrc text);
SELECT * FROM myremote_pg_proc WHERE proname LIKE 'bytea%';
SELECT * FROM dblink('dbname=postgres options=-csearch_path=',
'select proname, prosrc from pg_proc')
AS t1(proname name, prosrc text) WHERE proname LIKE 'bytea%';
proname | prosrc
------------+------------
byteacat | byteacat
byteaeq | byteaeq
bytealt | bytealt
byteale | byteale
byteagt | byteagt
byteage | byteage
byteane | byteane
byteacmp | byteacmp
bytealike | bytealike
byteanlike | byteanlike
byteain | byteain
byteaout | byteaout
(12 rows)
SELECT dblink_connect('dbname=postgres options=-csearch_path=');
dblink_connect
----------------
OK
(1 row)
SELECT * FROM dblink('select proname, prosrc from pg_proc')
AS t1(proname name, prosrc text) WHERE proname LIKE 'bytea%';
proname | prosrc
------------+------------
byteacat | byteacat
byteacmp | byteacmp
byteaeq | byteaeq
byteage | byteage
byteagt | byteagt
byteain | byteain
byteale | byteale
bytealike | bytealike
bytealt | bytealt
byteane | byteane
byteanlike | byteanlike
byteaout | byteaout
(12 rows)
SELECT dblink_connect('myconn', 'dbname=regression options=-csearch_path=');
dblink_connect
----------------
OK
(1 row)
SELECT * FROM dblink('myconn', 'select proname, prosrc from pg_proc')
AS t1(proname name, prosrc text) WHERE proname LIKE 'bytea%';
proname | prosrc
------------+------------
bytearecv | bytearecv
byteasend | byteasend
byteale | byteale
byteagt | byteagt
byteage | byteage
byteane | byteane
byteacmp | byteacmp
bytealike | bytealike
byteanlike | byteanlike
byteacat | byteacat
byteaeq | byteaeq
bytealt | bytealt
byteain | byteain
byteaout | byteaout
(14 rows)