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
如果为 true(省略时为默认值),则连接的远程端抛出的错误也会在本地抛出错误。如果为 false,则远程错误在本地报告为 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)
如果您在文档中看到任何不正确、与您使用特定功能的经验不符或需要进一步澄清的地方,请使用此表单报告文档问题。