【PostgreSQL】PostgreSQL的dblink扩展模块详解(史上最全)

【PostgreSQL】PostgreSQL的dblink扩展模块详解(史上最全)

  • 一、PostgreSQL的dblink扩展模块简介
  • 二、dblink使用方法
    • 2.1、安装dblink扩展
      • 2.1.1、安装dblink扩展
      • 2.1.2、查询已安装的dblink扩展情况
        • 2.1.2.1、已安装的扩展
        • 2.1.2.1、所有扩展
        • 2.2、创建连接
        • 2.3、查询数据
        • 2.4、执行函数
        • 2.5、关闭连接
        • 2.6、查看 dblink 连接
        • 三、dblink涉及的所有函数详解
          • 3.1、dblink_connect 打开一个到远程数据库的持久连接
          • 3.2、dblink_connect_u 不安全地打开一个到远程数据库的持久连接
          • 3.3、dblink_disconnect 关闭一个到远程数据库的持久连接
          • 3.4、dblink 在一个远程数据库中执行一个查询
          • 3.5、dblink_exec 在一个远程数据库中执行一个命令
          • 3.6、dblink_open 在一个远程数据库中打开一个游标
          • 3.7、dblink_fetch 从一个远程数据库中的打开的游标返回行
          • 3.8、dblink_close 关闭一个远程数据库中的游标
          • 3.9、dblink_get_connections 返回所有打开的命名 dblink 连接的名称
          • 3.10、dblink_error_message 得到在命名连接上的最后一个错误消息
          • 3.11、dblink_send_query 发送一个异步查询到远程数据库
          • 3.12、dblink_is_busy 检查连接是否正在忙于一个异步查询
          • 3.13、dblink_get_notify 在一个连接上检索异步通知
          • 3.14、dblink_get_result 得到一个异步查询结果
          • 3.15、dblink_cancel_query 在命名连接上取消任何活动查询
          • 3.16、dblink_get_pkey 返回一个关系的主键域的位置和域名称
          • 3.17、dblink_build_sql_insert 使用一个本地元组构建一个 INSERT 语句,将主键域值替换为提供的值
          • 3.18、dblink_build_sql_delete 使用所提供的主键域值构建一个 DELETE 语句
          • 3.19、dblink_build_sql_update 使用一个本地元组构建一个 UPDATE 语句,将主键域值替换为提供的值

            一、PostgreSQL的dblink扩展模块简介

            • PostgreSQL的dblink是一个支持在一个数据库会话中连接到其他PostgreSQL数据库的扩展模块。可以实现在不同的数据库之间进行通信和交互。它可以让你在一个数据库中访问另一个数据库的表格和函数,甚至可以在不同的服务器之间进行数据交互。

              二、dblink使用方法

              下面是dblink的使用方法:

              2.1、安装dblink扩展

              2.1.1、安装dblink扩展

              在使用dblink之前,需要确保已经安装了dblink扩展。可以使用以下命令进行安装:

              CREATE EXTENSION dblink;
              

              2.1.2、查询已安装的dblink扩展情况

              2.1.2.1、已安装的扩展
              select * from pg_extension;
              
              2.1.2.1、所有扩展
              select * from pg_available_extensions where name like '%dblink%';
              

              2.2、创建连接

              使用dblink连接到另一个数据库,需要指定连接参数,例如主机名、端口号、用户名和密码等。可以使用以下语法创建连接:

              SELECT dblink_connect('dblink_name', 'dbname=mydb host=localhost port=5432 user=myuser password=mypassword');
              

              其中,dblink_name是自己起的dblink的名字,也可以是连接字符串。

              dbname是要连接的数据库名称,host是要连接的主机名,port是要连接的端口号,user是要连接的用户名,password是要连接的密码。

              2.3、查询数据

              连接成功后,可以使用dblink执行SQL查询语句。例如,可以使用以下语法在另一个数据库中查询数据:

              SELECT * FROM dblink('dblink_name', 'SELECT * FROM mytable') AS t(id int, name text);
              

              其中,第一个参数是dblink名字,也可以是连接字符串。

              第二个参数是要执行的SQL查询语句。AS子句用于指定返回结果的列名和数据类型。

              例如下面的示例SQL:

              select * from dblink('dblink_name','select log_id, log_name from tzq.tzq_log_t') as t (log_id int8, log_name varchar(150));
              

              2.4、执行函数

              除了查询数据,还可以使用dblink在另一个数据库中执行函数。例如,可以使用以下语法在另一个数据库中执行一个函数:

              SELECT dblink('dblink_name', 'SELECT myfunction()');
              

              其中,第一个参数是dblink名字,也可以是连接字符串。

              第二个参数是要执行的函数调用语句。

              例如下面的示例SQL:

              select * from dblink('dblink_name','
              select plan.get_all_table_ddl(''tzq'')') as t (get_all_table_ddl text);
              

              2.5、关闭连接

              完成操作后,需要关闭连接以释放资源。可以使用以下语法关闭连接:

              SELECT dblink_disconnect('dblink_name');
              

              其中,参数是dblink名字,也可以是连接字符串。

              2.6、查看 dblink 连接

              SELECT dblink_get_connections();
              

              三、dblink涉及的所有函数详解

              3.1、dblink_connect 打开一个到远程数据库的持久连接

              dblink_connect 打开一个到远程数据库的持久连接

              • 大纲
                dblink_connect(text connstr) 返回 text
                dblink_connect(text connname, text connstr) 返回 text
                
                • 描述

                  • dblink_connect()建立一个到远程PostgreSQL数据库的连接。要联系的服务器和数据库通过一个标准的libpq连接串来标识。可以选择将一个名字赋予给该连接。多个命名的连接可以被一次打开,但是一次只允许一个未命名连接。连接将会持续直到被关闭或者数据库会话结束。

                  • 连接串也可以是一个现存外部服务器的名字。在使用外部服务器时,我们推荐使用外部数据包装器dblink_fdw。见下面的例子,以及CREATE SERVER和CREATE USER MAPPING。

                  • 参数

                    • connname

                      要用于这个连接的名字。如果被忽略,将打开一个未命名连接并且替换掉任何现有的未命名连接。

                    • connstr

                      libpq-风格的连接信息串,例如 hostaddr=127.0.0.1 port=5432 dbname=mydb user=postgres password=mypasswd。详见第33.1.1节。此外,还可以是一个外部服务器的名字。

                    • 返回值

                      • 返回状态,它总是OK(因为任何错误会导致该函数抛出一个错误而不是返回)。
                      • 注解

                        • 如果不可信用户能够访问一个没有采用安全方案使用模式的数据库,应该在开始每个会话时从search_path中移除公共可写的方案。例如,可以把options=-csearch_path=增加到connstr。这种考虑不是特别针对dblink,它适用于每一种执行任意SQL命令的接口。

                        • 只有超级用户能够使用dblink_connect来创建无口令认证连接。如果非超级用户需要这种能力,使用dblink_connect_u。

                        • 选择包含等号的连接名是不明智的,因为这会产生与在其他dblink函数中的连接信息串混淆的风险。

                        • 例子

                          SELECT dblink_connect('dbname=postgres options=-csearch_path=');
                           dblink_connect
                          ----------------
                           OK
                          (1 row)
                          SELECT dblink_connect('myconn', 'dbname=postgres options=-csearch_path=');
                           dblink_connect
                          ----------------
                           OK
                          (1 row)
                          -- FOREIGN DATA WRAPPER functionality
                          -- Note: local connection must require password authentication for this to work properly
                          --       Otherwise, you will receive the following error from dblink_connect():
                          --       ERROR:  password is required
                          --       DETAIL:  Non-superuser cannot connect if the server does not request a password.
                          --       HINT:  Target server's authentication method must be changed.
                          CREATE SERVER fdtest FOREIGN DATA WRAPPER dblink_fdw OPTIONS (hostaddr '127.0.0.1', dbname 'contrib_regression');
                          CREATE USER regress_dblink_user WITH PASSWORD 'secret';
                          CREATE USER MAPPING FOR regress_dblink_user SERVER fdtest OPTIONS (user 'regress_dblink_user', password 'secret');
                          GRANT USAGE ON FOREIGN SERVER fdtest TO regress_dblink_user;
                          GRANT SELECT ON TABLE foo TO regress_dblink_user;
                          \set ORIGINAL_USER :USER
                          \c - regress_dblink_user
                          SELECT dblink_connect('myconn', 'fdtest');
                           dblink_connect 
                          ----------------
                           OK
                          (1 row)
                          SELECT * FROM dblink('myconn', 'SELECT * FROM foo') AS t(a int, b text, c text[]);
                           a  | b |       c
                          ----+---+---------------
                            0 | a | {a0,b0,c0}
                            1 | b | {a1,b1,c1}
                            2 | c | {a2,b2,c2}
                            3 | d | {a3,b3,c3}
                            4 | e | {a4,b4,c4}
                            5 | f | {a5,b5,c5}
                            6 | g | {a6,b6,c6}
                            7 | h | {a7,b7,c7}
                            8 | i | {a8,b8,c8}
                            9 | j | {a9,b9,c9}
                           10 | k | {a10,b10,c10}
                          (11 rows)
                          \c - :ORIGINAL_USER
                          REVOKE USAGE ON FOREIGN SERVER fdtest FROM regress_dblink_user;
                          REVOKE SELECT ON TABLE foo FROM regress_dblink_user;
                          DROP USER MAPPING FOR regress_dblink_user SERVER fdtest;
                          DROP USER regress_dblink_user;
                          DROP SERVER fdtest;
                          

                          3.2、dblink_connect_u 不安全地打开一个到远程数据库的持久连接

                          dblink_connect_u 不安全地打开一个到远程数据库的持久连接

                          • 大纲
                            dblink_connect_u(text connstr) 返回 text
                            dblink_connect_u(text connname, text connstr) 返回 text
                            
                            • 描述
                              • dblink_connect_u()和dblink_connect()一样,不过它将允许非超级用户使用任意认证方式来连接。

                              • 如果远程服务器选择了一种不涉及口令的认证方式,那么可能发生模仿以及后续的扩大权限,因为该会话看起来像由运行PostgreSQL的用户发起的。此外,即使远程服务器不要求一个口令,也可能从服务器环境提供该口令,例如一个属于服务器用户的~/.pgpass文件。这带来的不只是模仿的风险,而且还有将口令暴露给不可信的远程服务器的风险。因此,dblink_connect_u()最初是用所有从PUBLIC撤销的特权安装的,这让它只能被超级用户调用。在某些情况中,为dblink_connect_u()授予EXECUTE权限给可信的指定用户是合适的,但是必须小心。我们也推荐任何属于服务器用户的~/.pgpass文件不能包含任何指定了一个通配符主机名的记录。

                                详见dblink_connect()。


                                3.3、dblink_disconnect 关闭一个到远程数据库的持久连接

                                dblink_disconnect 关闭一个到远程数据库的持久连接

                                • 大纲
                                  dblink_disconnect() 返回 text
                                  dblink_disconnect(text connname) 返回 text
                                  
                                  • 描述

                                    • dblink_disconnect()关闭一个之前被dblink_connect()打开的连接。不带参数的形式关闭一个未命名连接。
                                    • 参数

                                      • connname

                                        要被关闭的命名连接的名字。

                                      • 返回值

                                        它总是OK(因为任何错误会导致该函数抛出一个错误而不是返回)。

                                      • 例子

                                        SELECT dblink_disconnect();
                                         dblink_disconnect
                                        -------------------
                                         OK
                                        (1 row)
                                        SELECT dblink_disconnect('myconn');
                                         dblink_disconnect
                                        -------------------
                                         OK
                                        (1 row)
                                        

                                        3.4、dblink 在一个远程数据库中执行一个查询

                                        dblink 在一个远程数据库中执行一个查询

                                        • 大纲
                                          dblink(text connname, text sql [, bool fail_on_error]) 返回记录集
                                          dblink(text connstr, text sql [, bool fail_on_error]) 返回记录集
                                          dblink(text sql [, bool fail_on_error]) 返回记录集
                                          
                                          • 描述

                                            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)
                                                    

                                                    3.5、dblink_exec 在一个远程数据库中执行一个命令

                                                    dblink_exec 在一个远程数据库中执行一个命令

                                                    • 大纲
                                                      dblink_exec(text connname, text sql [, bool fail_on_error]) returns text
                                                      dblink_exec(text connstr, text sql [, bool fail_on_error]) returns text
                                                      dblink_exec(text sql [, bool fail_on_error]) returns text
                                                      
                                                      • 描述

                                                        dblink_exec在一个远程数据库中执行一个命令(也就是,任何不返回行的 SQL 语句)。

                                                        当给定两个text参数时,第一个被首先作为一个持久连接的名称进行查找;如果找到,该命令会在该连接上被执行。如果没有找到,第一个参数被视作一个用于dblink_connect的连接信息字符串,并且被指出的连接只是在这个命令的持续期间被建立。

                                                        • 参数

                                                          • connname

                                                            要使用的连接名。忽略这个参数将使用未命名连接。

                                                          • connstr

                                                            如之前为dblink_connect所描述的一个连接信息字符串。

                                                          • sql

                                                            你希望在远程数据库中执行的 SQL 命令,例如insert into foo values(0, ‘a’, ‘{“a0”,“b0”,“c0”}’)。

                                                          • fail_on_error

                                                            如果为真(忽略时的默认值),那么在连接的远端抛出的一个错误也会导致本地抛出一个错误。如果为假,远程错误只在本地被报告为一个 NOTICE,并且该函数的返回值被设置为ERROR。

                                                          • 返回值

                                                            返回状态,可能是命令的状态字符串或ERROR。

                                                          • 例子

                                                            SELECT dblink_connect('dbname=dblink_test_standby');
                                                             dblink_connect
                                                            ----------------
                                                             OK
                                                            (1 row)
                                                            SELECT dblink_exec('insert into foo values(21, ''z'', ''{"a0","b0","c0"}'');');
                                                               dblink_exec
                                                            -----------------
                                                             INSERT 943366 1
                                                            (1 row)
                                                            SELECT dblink_connect('myconn', 'dbname=regression');
                                                             dblink_connect
                                                            ----------------
                                                             OK
                                                            (1 row)
                                                            SELECT dblink_exec('myconn', 'insert into foo values(21, ''z'', ''{"a0","b0","c0"}'');');
                                                               dblink_exec
                                                            ------------------
                                                             INSERT 6432584 1
                                                            (1 row)
                                                            SELECT dblink_exec('myconn', 'insert into pg_class values (''foo'')',false);
                                                            NOTICE:  sql error
                                                            DETAIL:  ERROR:  null value in column "relnamespace" violates not-null constraint
                                                             dblink_exec
                                                            -------------
                                                             ERROR
                                                            (1 row)
                                                            

                                                            3.6、dblink_open 在一个远程数据库中打开一个游标

                                                            dblink_open 在一个远程数据库中打开一个游标

                                                            • 大纲
                                                              dblink_open(text cursorname, text sql [, bool fail_on_error]) 返回 text
                                                              dblink_open(text connname, text cursorname, text sql [, bool fail_on_error]) 返回 text
                                                              
                                                              • 描述

                                                                dblink_open()在一个远程数据库中打开一个游标。该游标能够随后使用dblink_fetch()和dblink_close()进行操纵。

                                                              • 参数

                                                                • connname

                                                                  要使用的连接名。忽略这个参数将使用未命名连接。

                                                                • cursorname

                                                                  要赋予给这个游标的名称。

                                                                • sql

                                                                  你希望在远程数据库中执行的SELECT语句,例如select * from pg_class。

                                                                • fail_on_error

                                                                  如果为真(忽略时的默认值),那么在连接的远端抛出的一个错误也会导致本地抛出一个错误。如果为假,远程错误只在本地被报告为一个 NOTICE,并且该函数的返回值被设置为ERROR。

                                                                • 返回值

                                                                  返回状态,OK或者ERROR。


                                                                  3.7、dblink_fetch 从一个远程数据库中的打开的游标返回行

                                                                  dblink_fetch 从一个远程数据库中的打开的游标返回行

                                                                  • 大纲
                                                                    dblink_fetch(text cursorname, int howmany [, bool fail_on_error]) 返回 record 集合
                                                                    dblink_fetch(text connname, text cursorname, int howmany [, bool fail_on_error]) 返回 record 集合
                                                                    
                                                                    • 描述

                                                                      dblink_fetch从一个之前由dblink_open建立的游标中取得行。

                                                                    • 参数

                                                                      • connname

                                                                        要使用的连接名。忽略这个参数将使用未命名连接。

                                                                      • cursorname

                                                                        要从中取数据的游标名。

                                                                      • howmany

                                                                        要检索的最大行数。从当前游标位置向前的接下来howmany个行会被取出。一旦该游标已经到达了它的末端,将不会产生更多行。

                                                                      • fail_on_error

                                                                        如果为真(忽略时的默认值),那么在连接的远端抛出的一个错误也会导致本地抛出一个错误。如果为假,远程错误只在本地被报告为一个 NOTICE,并且该函数不反回行。

                                                                      • 返回值

                                                                        该函数返回从游标中取出的行。要使用这个函数,你将需要指定想要的列集合,如前面dblink中所讨论的。


                                                                        3.8、dblink_close 关闭一个远程数据库中的游标

                                                                        dblink_close 关闭一个远程数据库中的游标

                                                                        • 大纲
                                                                          dblink_close(text cursorname [, bool fail_on_error]) 返回 text
                                                                          dblink_close(text connname, text cursorname [, bool fail_on_error]) 返回 text
                                                                          
                                                                          • 描述

                                                                            dblink_close关闭一个之前由dblink_open打开的游标。

                                                                          • 参数

                                                                            • connname

                                                                              要使用的连接名。忽略这个参数将使用未命名连接。

                                                                            • cursorname

                                                                              要关闭的游标名。

                                                                            • fail_on_error

                                                                              如果为真(忽略时的默认值),那么在连接的远端抛出的一个错误也会导致本地抛出一个错误。如果为假,远程错误只在本地被报告为一个 NOTICE,并且该函数的返回值被设置为ERROR。

                                                                            • 返回值

                                                                              返回状态,OK或者ERROR。

                                                                            • 注解

                                                                              如果dblink_open开始了一个显式事务块,并且这是这个连接中最后一个保持打开的游标,dblink_close将发出匹配的COMMIT。

                                                                            • 例子

                                                                              SELECT dblink_connect('dbname=postgres options=-csearch_path=');
                                                                               dblink_connect
                                                                              ----------------
                                                                               OK
                                                                              (1 row)
                                                                              SELECT dblink_open('foo', 'select proname, prosrc from pg_proc');
                                                                               dblink_open
                                                                              -------------
                                                                               OK
                                                                              (1 row)
                                                                              SELECT dblink_close('foo');
                                                                               dblink_close
                                                                              --------------
                                                                               OK
                                                                              (1 row)
                                                                              

                                                                              3.9、dblink_get_connections 返回所有打开的命名 dblink 连接的名称

                                                                              dblink_get_connections 返回所有打开的命名 dblink 连接的名称

                                                                              • 大纲
                                                                                dblink_get_connections() 返回 text[]
                                                                                
                                                                                • 描述

                                                                                  dblink_get_connections返回一个数组,其中是所有打开的命名dblink连接的名称。

                                                                                • 返回值

                                                                                  返回一个连接名称的文本数组,如果没有则为 NULL。

                                                                                • 例子

                                                                                  SELECT dblink_get_connections();
                                                                                  

                                                                                  3.10、dblink_error_message 得到在命名连接上的最后一个错误消息

                                                                                  dblink_error_message 得到在命名连接上的最后一个错误消息

                                                                                  • 大纲
                                                                                    dblink_error_message(text connname) 返回 text
                                                                                    
                                                                                    • 描述

                                                                                      dblink_error_message为一个给定连接取得最近的远程错误消息。

                                                                                    • 参数

                                                                                      • connname

                                                                                        要使用的连接名。

                                                                                      • 返回值

                                                                                        返回最后一个错误消息,如果在这个连接上没有错误则返回一个OK。

                                                                                      • 注释

                                                                                        当异步查询由dblink_send_query启动时, 与连接相关的错误消息可能不会得到更新,直到服务器的响应消息被用掉。 这通常意味着dblink_is_busy或dblink_get_result应在dblink_error_message之前被调用,以使得异步查询产生的任何错误都是可见的。

                                                                                        例子

                                                                                        SELECT dblink_error_message('dtest1');
                                                                                        

                                                                                        3.11、dblink_send_query 发送一个异步查询到远程数据库

                                                                                        dblink_send_query 发送一个异步查询到远程数据库

                                                                                        • 大纲
                                                                                          dblink_send_query(text connname, text sql) 返回 int
                                                                                          
                                                                                          • 描述

                                                                                            dblink_send_query发送一个要被异步执行的查询,也就是不需要立即等待结果。在该连接上不能有还在处理中的异步查询。

                                                                                            在成功地派送一个异步查询后,可以用dblink_is_busy检查完成状态,并且结果最终由dblink_get_result收集。也可以使用dblink_cancel_query尝试取消一个活动中的异步查询。

                                                                                            • 参数

                                                                                              • connname

                                                                                                要使用的连接名。

                                                                                              • sql

                                                                                                你希望在远程数据库中执行的 SQL 语句,例如select * from pg_class。

                                                                                              • 返回值

                                                                                                如果查询被成功地派送返回 1,否则返回 0。

                                                                                                例子

                                                                                                SELECT dblink_send_query('dtest1', 'SELECT * FROM foo WHERE f1 < 3');
                                                                                                

                                                                                                3.12、dblink_is_busy 检查连接是否正在忙于一个异步查询

                                                                                                dblink_is_busy 检查连接是否正在忙于一个异步查询

                                                                                                • 大纲
                                                                                                  dblink_is_busy(text connname) 返回 int
                                                                                                  
                                                                                                  • 描述

                                                                                                    dblink_is_busy测试是否一个异步查询正在进行中。

                                                                                                  • 参数

                                                                                                    • connname

                                                                                                      要检查的连接名。

                                                                                                    • 返回值

                                                                                                      如果连接正忙则返回 1,如果不忙则返回 0。如果这个函数返回 0,dblink_get_result将被保证不会阻塞。

                                                                                                      例子

                                                                                                      SELECT dblink_is_busy('dtest1');
                                                                                                      

                                                                                                      3.13、dblink_get_notify 在一个连接上检索异步通知

                                                                                                      dblink_get_notify 在一个连接上检索异步通知

                                                                                                      大纲

                                                                                                      dblink_get_notify() 返回 (notify_name text, be_pid int, extra text) 集合
                                                                                                      dblink_get_notify(text connname) 返回 (notify_name text, be_pid int, extra text) 集合
                                                                                                      

                                                                                                      描述

                                                                                                      • dblink_get_notify在一个未命名连接或者一个指定的命名连接上检索通知。要通过 dblink 接收通知,首先必须使用dblink_exec发出LISTEN。详见LISTEN和NOTIFY。

                                                                                                        参数

                                                                                                        • connname

                                                                                                          要在其上得到通知的命名连接的名称。

                                                                                                          返回值

                                                                                                          • 返回 (notify_name text, be_pid int, extra text) 集合,或者一个空集。

                                                                                                            例子

                                                                                                            SELECT dblink_exec('LISTEN virtual');
                                                                                                             dblink_exec
                                                                                                            -------------
                                                                                                             LISTEN
                                                                                                            (1 row)
                                                                                                            SELECT * FROM dblink_get_notify();
                                                                                                             notify_name | be_pid | extra
                                                                                                            -------------+--------+-------
                                                                                                            (0 rows)
                                                                                                            NOTIFY virtual;
                                                                                                            NOTIFY
                                                                                                            SELECT * FROM dblink_get_notify();
                                                                                                             notify_name | be_pid | extra
                                                                                                            -------------+--------+-------
                                                                                                             virtual     |   1229 |
                                                                                                            (1 row)
                                                                                                            

                                                                                                            3.14、dblink_get_result 得到一个异步查询结果

                                                                                                            dblink_get_result 得到一个异步查询结果

                                                                                                            大纲

                                                                                                            dblink_get_result(text connname [, bool fail_on_error]) 返回 record 集合
                                                                                                            

                                                                                                            描述

                                                                                                            • dblink_get_result收集之前dblink_send_query发送的一个异步查询的结果。如果该查询还没有完成,dblink_get_result将等待直到它完成。

                                                                                                              参数

                                                                                                              • connname

                                                                                                                要使用的连接名。

                                                                                                              • fail_on_error

                                                                                                                如果为真(忽略时的默认值),那么在连接的远端抛出的一个错误也会导致本地抛出一个错误。如果为假,远程错误只在本地被报告为一个 NOTICE,并且该函数不返回行。

                                                                                                                返回值

                                                                                                                • 对于一个异步查询(也就是一个返回行的 SQL 语句),该函数返回查询产生的行。要使用这个函数,你将需要指定所期待的列集合,如前面为dblink所讨论的那样。

                                                                                                                • 对于一个异步命令(也就是一个不返回行的 SQL 语句),该函数返回一个只有单个文本列的单行,其中包含了该命令的状态字符串。仍必须在调用的FROM子句中指定结果将具有一个单一文本行。

                                                                                                                  注解

                                                                                                                  • 如果dblink_send_query返回 1,这个函数就必须被调用。对每一个已发送的查询都必须调用一次这个函数,并且在连接再次可用之前还要多调用一次来得到一个空结果集。

                                                                                                                  • 当使用dblink_send_query和dblink_get_result时,在将结果集中的任何一行返回给本地查询处理器之前,dblink将取得整个远程查询结果。如果该查询返回大量的行,这可能会导致本地会话中短暂的内存膨胀。最好将这样的一个查询用dblink_open打开成一个游标并且接着每次取得数量可管理的行。也可以使用简单的dblink(),它会避免缓冲大型结果集到磁盘上导致的内存膨胀。

                                                                                                                    例子

                                                                                                                    contrib_regression=# SELECT dblink_connect('dtest1', 'dbname=contrib_regression');
                                                                                                                     dblink_connect
                                                                                                                    ----------------
                                                                                                                     OK
                                                                                                                    (1 row)
                                                                                                                    contrib_regression=# SELECT * FROM
                                                                                                                    contrib_regression-# dblink_send_query('dtest1', 'select * from foo where f1 < 3') AS t1;
                                                                                                                     t1
                                                                                                                    ----
                                                                                                                      1
                                                                                                                    (1 row)
                                                                                                                    contrib_regression=# SELECT * FROM dblink_get_result('dtest1') AS t1(f1 int, f2 text, f3 text[]);
                                                                                                                     f1 | f2 |     f3
                                                                                                                    ----+----+------------
                                                                                                                      0 | a  | {a0,b0,c0}
                                                                                                                      1 | b  | {a1,b1,c1}
                                                                                                                      2 | c  | {a2,b2,c2}
                                                                                                                    (3 rows)
                                                                                                                    contrib_regression=# SELECT * FROM dblink_get_result('dtest1') AS t1(f1 int, f2 text, f3 text[]);
                                                                                                                     f1 | f2 | f3
                                                                                                                    ----+----+----
                                                                                                                    (0 rows)
                                                                                                                    contrib_regression=# SELECT * FROM
                                                                                                                    contrib_regression-# dblink_send_query('dtest1', 'select * from foo where f1 < 3; select * from foo where f1 > 6') AS t1;
                                                                                                                     t1
                                                                                                                    ----
                                                                                                                      1
                                                                                                                    (1 row)
                                                                                                                    contrib_regression=# SELECT * FROM dblink_get_result('dtest1') AS t1(f1 int, f2 text, f3 text[]);
                                                                                                                     f1 | f2 |     f3
                                                                                                                    ----+----+------------
                                                                                                                      0 | a  | {a0,b0,c0}
                                                                                                                      1 | b  | {a1,b1,c1}
                                                                                                                      2 | c  | {a2,b2,c2}
                                                                                                                    (3 rows)
                                                                                                                    contrib_regression=# SELECT * FROM dblink_get_result('dtest1') AS t1(f1 int, f2 text, f3 text[]);
                                                                                                                     f1 | f2 |      f3
                                                                                                                    ----+----+---------------
                                                                                                                      7 | h  | {a7,b7,c7}
                                                                                                                      8 | i  | {a8,b8,c8}
                                                                                                                      9 | j  | {a9,b9,c9}
                                                                                                                     10 | k  | {a10,b10,c10}
                                                                                                                    (4 rows)
                                                                                                                    contrib_regression=# SELECT * FROM dblink_get_result('dtest1') AS t1(f1 int, f2 text, f3 text[]);
                                                                                                                     f1 | f2 | f3
                                                                                                                    ----+----+----
                                                                                                                    (0 rows)
                                                                                                                    

                                                                                                                    3.15、dblink_cancel_query 在命名连接上取消任何活动查询

                                                                                                                    dblink_cancel_query 在命名连接上取消任何活动查询

                                                                                                                    大纲

                                                                                                                    dblink_cancel_query(text connname) 返回 text
                                                                                                                    

                                                                                                                    描述

                                                                                                                    • dblink_cancel_query尝试命名连接上正在进行的任何查询。注意这不一定会成功(例如,远程查询可能已经结束)。一个取消请求仅仅提高了该查询将很快失败的几率。你仍必须完成通常的查询协议,例如通过调用dblink_get_result。

                                                                                                                      参数

                                                                                                                      • connname

                                                                                                                        要使用的连接名。

                                                                                                                        返回值

                                                                                                                        • 如果取消请求已经被发送,则返回OK;如果失败,则返回一个错误消息的文本。

                                                                                                                          例子

                                                                                                                          SELECT dblink_cancel_query('dtest1');
                                                                                                                          

                                                                                                                          3.16、dblink_get_pkey 返回一个关系的主键域的位置和域名称

                                                                                                                          dblink_get_pkey 返回一个关系的主键域的位置和域名称

                                                                                                                          大纲

                                                                                                                          dblink_get_pkey(text relname) 返回 dblink_pkey_results 集合
                                                                                                                          

                                                                                                                          描述

                                                                                                                          • dblink_get_pkey提供有关于本地数据库中一个关系的主键的信息。这有时候有助于生成要被发送到远程数据库的查询。

                                                                                                                            参数

                                                                                                                            • relname

                                                                                                                              一个本地关系的名称,例如foo或者myschema.mytab。如果该名称是大小写混合的或包含特殊字符,要包括双引号,例如"FooBar";如果没有引号,字符串将被折叠到小写形式。

                                                                                                                              返回值

                                                                                                                              • 为每一个主键域返回一行,如果该关系没有主键则不返回行。结果行类型被定义为:
                                                                                                                                CREATE TYPE dblink_pkey_results AS (position int, colname text);
                                                                                                                                
                                                                                                                                • position列值可以从 1 到 N,它是该域在主键中的编号,而不是在表列中的编号。

                                                                                                                                  例子

                                                                                                                                  CREATE TABLE foobar (
                                                                                                                                      f1 int,
                                                                                                                                      f2 int,
                                                                                                                                      f3 int,
                                                                                                                                      PRIMARY KEY (f1, f2, f3)
                                                                                                                                  );
                                                                                                                                  CREATE TABLE
                                                                                                                                  SELECT * FROM dblink_get_pkey('foobar');
                                                                                                                                   position | colname
                                                                                                                                  ----------+---------
                                                                                                                                          1 | f1
                                                                                                                                          2 | f2
                                                                                                                                          3 | f3
                                                                                                                                  (3 rows)
                                                                                                                                  

                                                                                                                                  3.17、dblink_build_sql_insert 使用一个本地元组构建一个 INSERT 语句,将主键域值替换为提供的值

                                                                                                                                  dblink_build_sql_insert 使用一个本地元组构建一个 INSERT 语句,将主键域值替换为提供的值

                                                                                                                                  大纲

                                                                                                                                  dblink_build_sql_insert(text relname,
                                                                                                                                                          int2vector primary_key_attnums,
                                                                                                                                                          integer num_primary_key_atts,
                                                                                                                                                          text[] src_pk_att_vals_array,
                                                                                                                                                          text[] tgt_pk_att_vals_array) 返回 text
                                                                                                                                  

                                                                                                                                  描述

                                                                                                                                  • dblink_build_sql_insert在选择性地将一个本地表复制到一个远程数据库时很有用。它基于主键从本地表选择一行,并且接着构建一个复制该行的INSERT命令,但是其中主键值被替换为最后一个参数中的值(要创建该行的一个准确拷贝,只要为最后两个参数指定相同的值)。

                                                                                                                                    参数

                                                                                                                                    • relname

                                                                                                                                      一个本地关系的名称,例如foo或者myschema.mytab。如果该名称是大小写混合的或包含特殊字符,要包括双引号,例如"FooBar";如果没有引号,字符串将被折叠到小写形式。

                                                                                                                                    • primary_key_attnums

                                                                                                                                      主键域的属性号(从 1 开始),例如1 2。

                                                                                                                                    • num_primary_key_atts

                                                                                                                                      主键域的数量。

                                                                                                                                    • src_pk_att_vals_array

                                                                                                                                      要被用来查找本地元组的主键域值。每一个域都被表示为文本形式。如果没有行具有这些主键值,则抛出一个错误。

                                                                                                                                    • tgt_pk_att_vals_array

                                                                                                                                      要被替换到结果INSERT命令中的主键域值。每一个域被表示为文本形式。

                                                                                                                                      返回值

                                                                                                                                      • 将要求的 SQL 语句返回为文本。

                                                                                                                                        注解

                                                                                                                                        • 自PostgreSQL 9.0 开始,primary_key_attnums中的属性号被解释为逻辑列号,对应于列在SELECT * FROM relname中的位置。之前的版本将属性号解释为物理列位置。如果指示出的列的左边有任意列在该表的生存期内被删除,这两种解释就有区别。

                                                                                                                                          例子

                                                                                                                                          SELECT dblink_build_sql_insert('foo', '1 2', 2, '{"1", "a"}', '{"1", "b''a"}');
                                                                                                                                                       dblink_build_sql_insert
                                                                                                                                          --------------------------------------------------
                                                                                                                                           INSERT INTO foo(f1,f2,f3) VALUES('1','b''a','1')
                                                                                                                                          (1 row)
                                                                                                                                          

                                                                                                                                          3.18、dblink_build_sql_delete 使用所提供的主键域值构建一个 DELETE 语句

                                                                                                                                          dblink_build_sql_delete 使用所提供的主键域值构建一个 DELETE 语句

                                                                                                                                          大纲

                                                                                                                                          dblink_build_sql_delete(text relname,
                                                                                                                                                                  int2vector primary_key_attnums,
                                                                                                                                                                  integer num_primary_key_atts,
                                                                                                                                                                  text[] tgt_pk_att_vals_array) 返回 text
                                                                                                                                          

                                                                                                                                          描述

                                                                                                                                          • dblink_build_sql_delete在选择性地将一个本地表复制到一个远程数据库时很有用。它构建一个 SQL DELETE命令用来删除具有给定主键值的行。

                                                                                                                                            参数

                                                                                                                                            • relname

                                                                                                                                              一个本地关系的名称,例如foo或者myschema.mytab。如果该名称是大小写混合的或包含特殊字符,要包括双引号,例如"FooBar";如果没有引号,字符串将被折叠到小写形式。

                                                                                                                                            • primary_key_attnums

                                                                                                                                              主键域的属性号(从 1 开始),例如1 2。

                                                                                                                                            • num_primary_key_atts

                                                                                                                                              主键域的数量。

                                                                                                                                            • tgt_pk_att_vals_array

                                                                                                                                              要用在结果DELETE命令中的主键域值。每一个域都被表示为文本形式。

                                                                                                                                              返回值

                                                                                                                                              • 将要求的 SQL 语句返回为文本。

                                                                                                                                                注解

                                                                                                                                                • 自PostgreSQL 9.0 开始,primary_key_attnums中的属性号被解释为逻辑列号,对应于列在SELECT * FROM relname中的位置。之前的版本将属性号解释为物理列位置。如果指示出的列的左边有任意列在该表的生存期内被删除,这两种解释就有区别。

                                                                                                                                                  例子

                                                                                                                                                  SELECT dblink_build_sql_delete('"MyFoo"', '1 2', 2, '{"1", "b"}');
                                                                                                                                                             dblink_build_sql_delete
                                                                                                                                                  ---------------------------------------------
                                                                                                                                                   DELETE FROM "MyFoo" WHERE f1='1' AND f2='b'
                                                                                                                                                  (1 row)
                                                                                                                                                  

                                                                                                                                                  3.19、dblink_build_sql_update 使用一个本地元组构建一个 UPDATE 语句,将主键域值替换为提供的值

                                                                                                                                                  dblink_build_sql_update 使用一个本地元组构建一个 UPDATE 语句,将主键域值替换为提供的值

                                                                                                                                                  大纲

                                                                                                                                                  dblink_build_sql_update(text relname,
                                                                                                                                                                          int2vector primary_key_attnums,
                                                                                                                                                                          integer num_primary_key_atts,
                                                                                                                                                                          text[] src_pk_att_vals_array,
                                                                                                                                                                          text[] tgt_pk_att_vals_array) 返回 text
                                                                                                                                                  

                                                                                                                                                  描述

                                                                                                                                                  • dblink_build_sql_update在选择性地将一个本地表复制到一个远程数据库时很有用。它从本地表基于主键选择一行,并且接着构建一个 SQL UPDATE命令来复制该行,但是其中的主键值被替换为最后一个参数中的值(要创建该行的一个准确拷贝,只要为最后两个参数指定相同的值)。UPDATE命令总是为该行的所有域赋值 这个函数与dblink_build_sql_insert之间的主要区别是它假定目标行已经存在于远程表中。

                                                                                                                                                    参数

                                                                                                                                                    • relname

                                                                                                                                                      一个本地关系的名称,例如foo或者myschema.mytab。如果该名称是大小写混合的或包含特殊字符,要包括双引号,例如"FooBar";如果没有引号,字符串将被折叠到小写形式。

                                                                                                                                                    • primary_key_attnums

                                                                                                                                                      主键域的属性号(从 1 开始),例如1 2。

                                                                                                                                                    • num_primary_key_atts

                                                                                                                                                      主键域的数量。

                                                                                                                                                    • src_pk_att_vals_array

                                                                                                                                                      要被用来查找本地元组的主键域值。每一个域都被表示为文本形式。如果没有行具有这些主键值,则抛出一个错误。

                                                                                                                                                    • tgt_pk_att_vals_array

                                                                                                                                                      要用在结果UPDATE命令中的主键域值。每一个域都被表示为文本形式。

                                                                                                                                                      返回值

                                                                                                                                                      • 将要求的 SQL 语句返回为文本。

                                                                                                                                                        注解

                                                                                                                                                        • 自PostgreSQL 9.0 开始,primary_key_attnums中的属性号被解释为逻辑列号,对应于列在SELECT * FROM relname中的位置。之前的版本将属性号解释为物理列位置。如果指示出的列的左边有任意列在该表的生存期内被删除,这两种解释就有区别。

                                                                                                                                                          例子

                                                                                                                                                          SELECT dblink_build_sql_update('foo', '1 2', 2, '{"1", "a"}', '{"1", "b"}');
                                                                                                                                                                             dblink_build_sql_update
                                                                                                                                                          -------------------------------------------------------------
                                                                                                                                                           UPDATE foo SET f1='1',f2='b',f3='1' WHERE f1='1' AND f2='b'
                                                                                                                                                          (1 row)