dblink — 在远程数据库中执行查询
dblink(text connname, text sql [, bool fail_on_error]) 返回 setof record dblink(text connstr, text sql [, bool fail_on_error]) 返回 setof record dblink(text sql [, bool fail_on_error]) 返回 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 子句中的 “alias” 部分必须指定该函数将返回的列名和类型。(在别名中指定列名实际上是标准 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)
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。