dblink
Prev UpF.11. dblink — conectarse a otras bases de datos PostgreSQLHome Next

dblink

dblink — ejecuta una consulta en una base de datos remota

Synopsis

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

Descripción

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.

Argumentos

connname

Nombre 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_error

Si 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.

Valor de retorno

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.

Notas

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%';

Ejemplos

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)

Prev Up Next
dblink_disconnect Home dblink_exec