contrib-dblink-function.md 3.0 KB
Newer Older
李少辉-开发者's avatar
李少辉-开发者 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
## 数据库链接

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
```

## 描述

`数据库链接`执行查询(通常是`选择`,但它可以是远程数据库中的任何返回行的 SQL 语句。

当两个`文本`给出参数时,首先查找第一个作为持久连接的名称;如果找到,则在该连接上执行该命令。如果未找到,则第一个参数被视为连接信息字符串,如`dblink_connect`,并且指示的连接仅在此命令的持续时间内进行。

## 论据

*`连名`*

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

*`connstr`*

连接信息字符串,如前所述`dblink_connect`.

*`sql`*

您希望在远程数据库中执行的 SQL 查询,例如`从 foo 中选择 *`.

*`fail_on_error`*

如果为 true(省略时的默认值),则在连接的远程端引发的错误会导致本地也引发错误。如果为 false,则远程错误在本地报告为 NOTICE,并且该函数不返回任何行。

## 返回值

该函数返回查询产生的行。自从`数据库链接`可以与任何查询一起使用,它被声明为返回`记录`,而不是指定任何特定的列集。这意味着您必须在调用查询中指定预期的列集——否则 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%';
```

的“别名”部分`从`子句必须指定函数将返回的列名和类型。(在别名中指定列名实际上是标准 SQL 语法,但指定列类型是 PostgreSQL 扩展。)这允许系统理解什么`*`应该扩展到什么`名字`在里面`在哪里`子句是指在尝试执行函数之前。在运行时,如果来自远程数据库的实际查询结果与显示的列数不同,则会引发错误。`从`条款。但是,列名不必匹配,并且`数据库链接`也不坚持精确的类型匹配。只要返回的数据字符串是在声明的列类型的有效输入,它就会成功`从`条款。

## 笔记

一种方便的使用方式`数据库链接`与预定查询是创建一个视图。这允许将列类型信息隐藏在视图中,而不必在每个查询中都将其拼写出来。例如,

```
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
```