[转帖]15.1. 插件dblink简介
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简介的更多相关文章
- ThreeJS系列2_effect插件集简介( 3d, vr等 )
ThreeJS系列2_effect插件集简介( 3d, vr等 ) ThreeJS 官方案例中有一些 js库 可以替代 render 将场景中的物质变换为其他效果的物质 目录 ThreeJS系列2_e ...
- jQuery Form 表单提交插件----Form 简介,官方文档,官方下载地址
一.jQuery Form简介 jQuery Form插件是一个优秀的Ajax表单插件,可以非常容易地.无侵入地升级HTML表单以支持Ajax.jQuery Form有两个核心方法 -- ajaxF ...
- jQuery Validate 表单验证插件----Validate简介,官方文档,官方下载地址
一. jQuery Validate 插件的介绍 jQuery Validate 插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供了大量的定制选项,满足应用程序各种需求.该插件捆 ...
- markdown绘图插件----mermaid简介
作者:黄永刚 mermaid简介 当撰写文档的时候,对于流程图的生成大多使用Visio等繁重的工具,没有一种轻便的工具能够画图从而简化文档的编写,就像markdown那样. mermaid解决这个痛点 ...
- Maven插件的简介,安装及在eclipse中配置
1.Maven简介 1.Maven介绍 Maven是一个基于项目对象模型(POM:project object model)的概念的纯java开发的开源的项目管理工具.Maven把我们的工程抽像一个对 ...
- [转帖]sql server版本特性简介、版本介绍简介
sql server版本特性简介.版本介绍简介 https://www.cnblogs.com/gered/p/10986240.html 目录 1.1.sql server的版本信息 1.2.版本重 ...
- 【转帖】安卓的Bionic 简介
https://blog.csdn.net/yongyu_it/article/details/52574797 google 自己实现了一套libc 的库函数 比glibc 要小一些 占用内存也小. ...
- osg探究补充:osg数据加载原理(插件机制简介)
前言 我们接着昨天的继续,昨天主要是讲解了DatabasePager类中的特定的成员变量以及run函数的第一部分,对所要请求加载的数据按照是否是网络数据进行分类加载模式.今天我们就看看数据是怎们加载到 ...
- Liferay7 BPM门户开发之15: Liferay开发体系简介
Liferay SDK 开发体系 主要分6种: Portlet Hook Theme Layout Templates Web Modules Ext Portlet :类似于servlet的web组 ...
- [转帖]PG里面的Citus简介----找时间学习一下.
1. Citus是什么 是PostgreSQL的扩展,可以同PG一同安装,之后通过SQL命令加入到数据库中. [相关操作] ? 1 2 #创建Citus扩展: CREATE EXTENSION cit ...
随机推荐
- 2023“强网杯”部分WP
强网先锋 SpeedUp 题目 我的解答: 分析代码可知是求2的27次方的阶乘的每一位的和. 使用在线网址直接查看:https://oeis.org/A244060/list 然后sha256加密 f ...
- POJ 3003 DP 寻路 记录路径
POJ 3003 DP 寻路 记录路径 我一开始把M看成是每个a_i的上限了,这是致命的,因为这个题dfs暴力搜索+剪枝是过不了的因为M<=40,全部状态有2的四十次幂. 正解是DP,设dp[i ...
- CUDA C编程权威指南:1-基于CUDA的异构并行计算
什么是CUDA?CUDA(Compute Unified Device Architecture,统一计算设备架构)是NVIDIA(英伟达)提出的并行计算架构,结合了CPU和GPU的优点,主要用来 ...
- 【华为云技术分享】解密如何使用昇腾AI计算解决方案构建业务引擎
摘要:昇腾AI计算解决方案以极致算力,端边云融合.全栈创新,开放生态的硬核实力.用户可以使用标准的Matrix接口实现业务引擎,对外释放昇腾AI加速能力. 从卷积神经网络中的矩阵乘法(GEMM)说起 ...
- 9个问题,带你掌握流程控制语句中的java原理
摘要:利用9个问题帮助记忆流程控制语句中的Java原理知识. 本文分享自华为云社区<流程控制语句知识点里的java原理>,作者:breakDraw . 相信大家经常会遇到这种问题 可是这个 ...
- 详解CNN实现中文文本分类过程
摘要:本文主要讲解CNN实现中文文本分类的过程,并与贝叶斯.决策树.逻辑回归.随机森林.KNN.SVM等分类算法进行对比. 本文分享自华为云社区<[Python人工智能] 二十一.Word2Ve ...
- 【鲲鹏 DevKit黑科技揭秘】│如何实现全链路系统问题90%精准诊断?
摘要:DevKit系统诊断工具是鲲鹏性能分析工具的子工具之一,能够针对内存.网络.存储等常见故障和异常,提供精准定位和诊断能力,帮助用户识别出源代码中的问题点,提升程序的可靠性,故障定位准确率高达90 ...
- APP 备案公钥、签名 MD5、SHA-1、SHA-256获取方法。
公钥和 MD5 值可以通过苹果开发工具.Keytool.appuploder 等多种工具获取,最简单的就是以 appuploader为例. 1.下载 appuploader工具 ,点击此处 下载 ...
- 火山引擎DataTester:无需研发人力,即刻开启企业A/B实验
近日,火山引擎A/B测试平台-- DataTester 对产品内A/B实验的"可视化编辑器"进行了新的升级,对交互.预览.Xpath的层次结构视图等能力均做了优化. 据介绍,火 ...
- 我的程序跑了60多小时,就是为了让你看一眼JDK的BUG导致的内存泄漏。
这次的文章从JDK的J.U.C包下的ConcurrentLinkedQueue队列的一个BUG讲起.jetty框架里面的线程池用到了这个队列,导致了内存泄漏. 同时通过jconsole.VisualV ...