dblink — exécute une requête sur une base de données distante
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
exécute une requête (habituellement un
SELECT
, mais toute instruction
SQL qui renvoie des lignes est valable) sur une base de données distante.
Si deux arguments text
sont présents, le premier est d'abord
considéré comme nom de connexion persistante ; si cette connexion
est trouvée, la commande est exécutée sur cette connexion. Dans le cas
contraire, le premier argument est considéré être une chaîne de connexion
comme dans le cas de dblink_connect
, et la connexion
indiquée n'est conservée que pour la durée d'exécution de cette commande.
connname
Le nom de la connexion à utiliser ; ce paramètre doit être omis pour utiliser une connexion sans nom.
connstr
Une chaîne de connexion similaire à celle décrite précédemment pour
dblink_connect
.
sql
L'instruction SQL à exécuter sur l'hôte distant, par exemple
select * from foo
.
fail_on_error
Si true (valeur par défaut en cas d'omission), une erreur distante est reportée localement comme une erreur. Dans le cas contraire, un message d'erreur distant est traité localement comme un message de type NOTICE, et la fonction ne retourne aucune ligne.
La fonction renvoie les lignes produites par la requête. Comme
dblink
peut être utilisée avec toute requête, elle
est déclarée comme renvoyant le type record
, plutôt que de
préciser un ensemble particulier de colonnes. Cela signifie que
l'ensemble des colonnes attendues doit être précisé dans la
requête appelante -- sinon PostgreSQL
ne sait pas quoi attendre. Voici un exemple :
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 partie « alias » de la clause FROM
doit
spécifier les noms et types des colonnes retournés par la fonction.
(La précision des noms des colonnes dans un alias est une syntaxe
du standard SQL mais la précision des types des colonnes est une extension
PostgreSQL.) Cela permet au système de
savoir comment étendre *
, et à quoi correspond
proname
dans la clause
WHERE
avant de tenter l'exécution de la fonction. À l'exécution, une erreur
est renvoyée si le nombre de colonnes du résultat effectif de la requête
sur la base de données distante diffère de celui indiqué
dans la clause FROM
. Les noms de colonnes n'ont pas
besoin de correspondre et dblink
n'impose pas
une correspondance exacte des types. L'opération réussit
si les chaînes de données renvoyées sont valides pour le type déclaré
dans la clause FROM
.
Il est souvent plus pratique de créer une vue pour utiliser
dblink
avec des requêtes prédéterminées.
Cela permet de laisser la vue gérer le type de la colonne plutôt que
d'avoir à le saisir pour chaque requête. Par exemple :
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'); 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 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('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)