PostgreSQL Elephant Logo
2025年9月25日: PostgreSQL 18 发布!
dblink
上一步  上一级 F.11. dblink — 连接到其他 PostgreSQL 数据库 首页  下一步

dblink

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(省略时默认为 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)

上一步  上一级  下一步
dblink_disconnect  首页  dblink_exec