问题报告 纠错本页面

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的连接信息字符串,并且指定连接为了该命令的整个时间段。

参数

conname

要使用的连接名称;省略这个参数使用未命名连接。

connstr

连接信息字符串,如先前描述的dblink_connect

sql

你希望在远程数据库中执行的SQL查询,比如select * from foo

fail_on_error

如果真(忽略时缺省)那么在连接的远程端抛出的错误也会导致本地抛出错误, 如果假,那么远程错误在本地作为NOTICE被报告, 并且函数没有返回行。

返回值

该函数返回查询产生的行。因为dblink可以用于任何查询, 它被声明为返回record,而不是指定任何特定列。这意味着 在调用查询中你必须指定预期列; 否则PostgreSQL不知道发生什么,这有个例子:

SELECT *
    FROM dblink('dbname=mydb', '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', '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', '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');
 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)