https://help.kingbase.com.cn/v8.6.7.12/development/sql-plsql/ref-extended-plug-in/dblink.html

dblink是KingbaseES的一个扩展插件,支持在一个数据库会话中连接到其他Kingbase数据库的模块。

还可以参考 kingbase_fdw,它以一种更现代和更加兼容标准的架构提供了相同的功能。

  • 插件名为 dblink

  • 插件版本 V1.2

15.2. 插件dblink加载方式 

CREATE EXTENSION dblink;

15.3. 插件dblink的参数配置 

无需配置任何参数。

15.4. 插件dblink使用方法 

15.4.1. dblink_connect 

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

语法

dblink_connect(text connstr) 返回 text
dblink_connect(text connname, text connstr) 返回 text

描述

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

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

参数

connname

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

connstr

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

返回值

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

注解

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

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

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

示例

SELECT dblink_connect('hostaddr=127.0.0.1 port=54321 dbname=mydb user=myname password=mypasswd');
dblink_connect
----------------
OK
(1 row) SELECT dblink_connect('myconn', 'hostaddr=127.0.0.1 port=54321 dbname=mydb user=myname password=mypasswd');
dblink_connect
----------------
OK
(1 row) -- FOREIGN DATA WRAPPER functionality
-- 注意: 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;

15.4.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()一样,不过它将允许非超级用户使用任意认证方式来连接。

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

详见dblink_connect()。

15.4.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)

15.4.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,而不是指定任意特定的列集合。这意味着你必须指定在调用的查询中所期待的列集合, 否则KingbaseES将不知道会得到什么。这里是一个例子

SELECT *
FROM dblink('hostaddr=127.0.0.1 port=5432 dbname=mydb user=myname password=mypasswd', 'select proname, prosrc from pg_proc')
AS t1(proname name, prosrc text)
WHERE proname LIKE 'bytea%';

FROM子句的“alias”部分必须指定函数将返回的列名及类型(在一个别名中指定列名实际上是标准SQL语法,但是指定列类型是一种KingbaseES扩展)。这允许系统在尝试执行该函数之前就理解*将展开成什么,以及WHERE子句中的proname指的什么。在运行时,如果来自远程数据库的实际查询结果和FROM子句中显示的列数不同,将会抛出一个错误。不过,列名不需要匹配,并且dblink并不坚持精确地匹配类型。只要被返回的数据字符串是FROM子句中声明的列类型的合法输入,它就将会成功。

注解

一种将预定义查询用于dblink的方法是创建一个视图。这允许列类型信息被埋藏在该视图中,而不是在每一个查询中都拼写出来。例如

CREATE VIEW myremote_pg_proc AS
SELECT *
FROM dblink('hostaddr=127.0.0.1 port=5432 dbname=mydb user=myname password=mypasswd',
'select proname, prosrc from pg_proc')
AS t1(proname name, prosrc text); SELECT * FROM myremote_pg_proc WHERE proname LIKE 'bytea%';

示例

 SELECT * FROM dblink('hostaddr=127.0.0.1 port=5432 dbname=mydb user=myname password=mypasswd',
'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('hostaddr=127.0.0.1 port=5432 dbname=mydb user=myname password=mypasswd');
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', 'hostaddr=127.0.0.1 port=5432 dbname=mydb user=myname password=mypasswd');
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)

15.4.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('hostaddr=127.0.0.1 port=5432 dbname=mydb user=myname password=mypasswd');
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', 'hostaddr=127.0.0.1 port=5432 dbname=mydb user=myname password=mypasswd');
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)

15.4.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。

注解

因为一个游标只能在一个事务中持续,如果远端还没有在一个事务中,dblink_open会在远端开始一个显式事务块(BEGIN)。当匹配的dblink_close被执行时,这个事务将再次被关闭。注意如果你使用dblink_exec在dblink_open和dblink_close之间改变数据,并且接着发生了一个错误或者你在dblink_close之前使用了dblink_disconnect,你的更改将被丢失,因为事务将被中止。

示例

SELECT dblink_connect('hostaddr=127.0.0.1 port=5432 dbname=mydb user=myname password=mypasswd');
dblink_connect
----------------
OK
(1 row) SELECT dblink_open('foo', 'select proname, prosrc from pg_proc');
dblink_open
-------------
OK
(1 row)

15.4.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,并且该函数的返回值被设置为ERROR。

返回值

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

注解

当FROM子句中指定的返回列的数量和远程游标返回的实际列数不匹配时,将抛出一个错误。在这个事件中,远程游标仍会被前进错误没发生时应该前进的行数。对于远程FETCH完成之后在本地查询中发生的任何其他错误,情况也是一样。

示例

SELECT dblink_connect('hostaddr=127.0.0.1 port=5432 dbname=mydb user=myname password=mypasswd');
dblink_connect
----------------
OK
(1 row) SELECT dblink_open('foo', 'select proname, prosrc from pg_proc where proname
like ''bytea%''');
dblink_open
-------------
OK
(1 row) SELECT * FROM dblink_fetch('foo', 5) AS (funcname name, source text);
funcname | source
----------+----------
byteacat | byteacat
byteacmp | byteacmp
byteaeq | byteaeq
byteage | byteage
byteagt | byteagt
(5 rows) SELECT * FROM dblink_fetch('foo', 5) AS (funcname name, source text);
funcname | source
-----------+-----------
byteain | byteain
byteale | byteale
bytealike | bytealike
bytealt | bytealt
byteane | byteane
(5 rows) SELECT * FROM dblink_fetch('foo', 5) AS (funcname name, source text);
funcname | source
------------+------------
byteanlike | byteanlike
byteaout | byteaout
(2 rows) SELECT * FROM dblink_fetch('foo', 5) AS (funcname name, source text);
funcname | source
----------+--------
(0 rows)

15.4.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('hostaddr=127.0.0.1 port=5432 dbname=mydb user=myname password=mypasswd');
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)

15.4.9. dblink_get_connections 

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

语法

dblink_get_connections() 返回 text[]

描述

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

返回值

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

示例

SELECT dblink_get_connections();

15.4.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');

15.4.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');

15.4.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');

15.4.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)

15.4.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',
'hostaddr=127.0.0.1 port=5432 dbname=mydb user=myname password=mypasswd');
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)

15.4.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');

15.4.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)
); SELECT * FROM dblink_get_pkey('foobar');
position | colname
----------+---------
1 | f1
2 | f2
3 | f3
(3 rows)

15.4.17. dblink_build_sql_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 语句返回为文本。

注解

自KingbaseES 8.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)

15.4.18. dblink_build_sql_delete 

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

语法

描述

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 语句返回为文本。

注解

自KingbaseES 8.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)

15.4.19. dblink_build_sql_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 语句返回为文本。

注解

自KingbaseES 8.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)

15.5. 插件dblink卸载方法 

DROP EXTENSION dblink;

15.6. 插件dblink升级方法 

ALTER EXTENSION dblink UPDATE;

[转帖]15.1. 插件dblink简介的更多相关文章

  1. ThreeJS系列2_effect插件集简介( 3d, vr等 )

    ThreeJS系列2_effect插件集简介( 3d, vr等 ) ThreeJS 官方案例中有一些 js库 可以替代 render 将场景中的物质变换为其他效果的物质 目录 ThreeJS系列2_e ...

  2. jQuery Form 表单提交插件----Form 简介,官方文档,官方下载地址

     一.jQuery Form简介 jQuery Form插件是一个优秀的Ajax表单插件,可以非常容易地.无侵入地升级HTML表单以支持Ajax.jQuery Form有两个核心方法 -- ajaxF ...

  3. jQuery Validate 表单验证插件----Validate简介,官方文档,官方下载地址

     一. jQuery Validate 插件的介绍 jQuery Validate 插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供了大量的定制选项,满足应用程序各种需求.该插件捆 ...

  4. markdown绘图插件----mermaid简介

    作者:黄永刚 mermaid简介 当撰写文档的时候,对于流程图的生成大多使用Visio等繁重的工具,没有一种轻便的工具能够画图从而简化文档的编写,就像markdown那样. mermaid解决这个痛点 ...

  5. Maven插件的简介,安装及在eclipse中配置

    1.Maven简介 1.Maven介绍 Maven是一个基于项目对象模型(POM:project object model)的概念的纯java开发的开源的项目管理工具.Maven把我们的工程抽像一个对 ...

  6. [转帖]sql server版本特性简介、版本介绍简介

    sql server版本特性简介.版本介绍简介 https://www.cnblogs.com/gered/p/10986240.html 目录 1.1.sql server的版本信息 1.2.版本重 ...

  7. 【转帖】安卓的Bionic 简介

    https://blog.csdn.net/yongyu_it/article/details/52574797 google 自己实现了一套libc 的库函数 比glibc 要小一些 占用内存也小. ...

  8. osg探究补充:osg数据加载原理(插件机制简介)

    前言 我们接着昨天的继续,昨天主要是讲解了DatabasePager类中的特定的成员变量以及run函数的第一部分,对所要请求加载的数据按照是否是网络数据进行分类加载模式.今天我们就看看数据是怎们加载到 ...

  9. Liferay7 BPM门户开发之15: Liferay开发体系简介

    Liferay SDK 开发体系 主要分6种: Portlet Hook Theme Layout Templates Web Modules Ext Portlet :类似于servlet的web组 ...

  10. [转帖]PG里面的Citus简介----找时间学习一下.

    1. Citus是什么 是PostgreSQL的扩展,可以同PG一同安装,之后通过SQL命令加入到数据库中. [相关操作] ? 1 2 #创建Citus扩展: CREATE EXTENSION cit ...

随机推荐

  1. Java使用OSS实现上传文件

    阿里云OSS使用 1.准备OSS 访问阿里云官网,注册并登录账户(支付宝方便一些,顺便冲点钱) 在产品分类中,找到阿里云oss 然后创建一个bucket 2.使用OSS(上传文件) 2.1在阿里云网站 ...

  2. Flutter Getx 路由管理

    GetX 为我们封装了 Navigation ,无需 context 可进行跳转,使用 GetX 进行路由跳转非常的简单, 只需要调用 Get.to() 即可进行路由跳转, GetX 路由跳转简化了跳 ...

  3. presto是如何保证作业内存不会发生冲突和溢出

    摘要:presto计算引擎作为一个纯内存计算引擎,是如何保证计算过程不会发生作业内存溢出的?本篇文章会进行深入的学习和分析. 本文分享自华为云社区<presto是如何保证作业内存不会发生冲突和溢 ...

  4. OpenHarmony移植:XTS子系统之应用兼容性测试套件

    摘要:本文通过实例分析下ACTS应用兼容性测试套件移植案例,以及移植过程中特定的操作的原理. 本文分享自华为云社区<移植案例与原理 - XTS子系统之应用兼容性测试套件>,作者:zhush ...

  5. 通过windows自带管理工具、系统命令行、快捷键等快速操作

    windows自带管理工具 我们win+R 输入一些命令,可以快速打开一些界面,比如: sysdm.cpl win10.win11 我电脑,属性与之前win7不同了,我希望打开之前的属性打不开了 通过 ...

  6. Axure 形状交互

  7. PPT 动画-树叶摆动

    插入树叶 插入矩形,长宽放大1倍 树叶和矩形组合

  8. Django中安装websocket

    完整代码: https://gitee.com/mom925/django-system项目结构: 先安装所需库: pip install channels下面将websocket作为插件一样的只需要 ...

  9. AliPLC 智能丢包补偿算法,提升弱网环境的通话质量

    在线视频/语音通话逐渐成为人们日常生活的一部分,而复杂多变的网络环境会导致部分音频包无法传送到接收端,造成语音信号的短时中断或者卡顿,这会严重影响通话体验,为解决这类问题,阿里云视频云音频技术团队在综 ...

  10. 如何向已有的项目中添加C/C++代码?

    第一步: 我们需要在src/main下面建立一个cpp目录,然后在其中写一个CMakeLists.txt文件和一个cpp文件,直接给出代码: #CMakeLists.txt文件# For more i ...