dblink — 在远程数据库中执行查询
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 在远程数据库中执行一个查询(通常是 SELECT,但也可以是任何返回行的 SQL 语句)。
当给出两个 text 参数时,先按持久连接的名称查找第一个参数;如果找到,命令就在该连接上执行。如果没找到,第一个参数会被当作连接信息字符串(如同 dblink_connect 的用法),并且只为本次命令的执行建立所指示的连接。
connname要使用的连接名称;省略该参数以使用未命名连接。
connstr
连接信息字符串,如前面对 dblink_connect 的描述。
sql
你希望在远程数据库中执行的 SQL 查询,例如 select * from foo。
fail_on_error如果为真(省略时的默认值),连接远端抛出的错误也会导致本地抛出错误。如果为假,远程错误会在本地以 NOTICE 报告,并且函数不返回任何行。
该函数返回查询产生的行。由于 dblink 可以配合任何查询使用,它被声明为返回 record,而不指定任何特定的列集合。这意味着你必须在调用查询中指定期望的列集合 — 否则 PostgreSQL 将不知道该期待什么。例如:
SELECT *
FROM dblink('dbname=mydb options=-csearch_path=',
'select proname, prosrc from pg_proc')
AS t1(proname name, prosrc text)
WHERE proname LIKE 'bytea%';
FROM 子句的 “别名” 部分必须指定该函数将返回的列名与类型。(在别名中指定列名实际上是标准 SQL 语法,但指定列类型是 PostgreSQL 的扩展。)这使系统能够在尝试执行该函数之前理解 * 应当展开成什么,以及 WHERE 子句中的 proname 指什么。运行时,如果来自远程数据库的实际查询结果与 FROM 子句中显示的列数不同,将抛出错误。不过列名无需匹配,dblink 也不坚持精确的类型匹配。只要返回的数据字符串对 FROM 子句中声明的列类型是有效输入,它就会成功。
把 dblink 用于预先确定的查询时,一个便捷方法是创建视图。这使列类型信息可以隐藏在视图中,而不必在每个查询里都写出来。例如,
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
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)