dblink
功能描述
dblink是一个可以在一个Vastbase数据库会话中连接到其它Vastbase数据库的工具。
本章主要介绍 dblink 插件的功能。
关于 Vastbase 数据库兼容 Oracle 语法 CREATE DATABASE LINK 的详细信息,请参见DATABASE LINK。
注意事项
因 Vastbase 与 PostgreSQL 依赖冲突,因此无法连接至 PostgreSQL 数据库。
语法格式
加载 dblink 扩展。
CREATE EXTENSION dblink;
打开一个到远程数据库的持久连接。
如果不指定 connname,则会开启一个未命名连接。可以同时打开多个不同名称的连接,仅支持同时打开一个未命名的连接。
连接会持续到手动关闭,或者数据库会话结束。
SELECT dblink_connect(constr); SELECT dblink_connect(connname,connstr);
关闭一个到远程数据库的持久连接。
如果不指定 connname,则表示关闭未命名连接。
SELECT dblink_disconnect(); SELECT dblink_disconnect(connname);
在远程数据库执行查询。
可以通过指定 conname 或 connstr 来指定连接执行查询,如果不指定,则表示使用未命名连接。
SELECT * FROM dblink(connname, sql_statement [, fail_on_error]); SELECT * FROM dblink(connstr, sql_statement [, fail_on_error]); SELECT * FROM dblink(sql_statement [, fail_on_error])
dblink 会返回record,而不是指定任何特定的列集合,也就是说,FROM子句的别名部分必须指定函数将返回的列名和类型。例如:
SELECT * FROM dblink('dbname=postgres', 'select proname, prosrc from pg_proc') AS t1(proname name, prosrc text) WHERE proname LIKE 'bytea%';
在运行时,如果来自远程数据库的实际查询结果的列数与from子句中显示的列数不同,则会引发错误。因此,建议将dblink与视图配合使用,避免每次调用。因此,可以将上述业务修改为以下形式:
CREATE VIEW view_16384 AS SELECT * FROM dblink('dbname=postgres', 'select proname, prosrc from pg_proc') AS t1(proname name, prosrc text); SELECT * FROM view_16384 WHERE proname LIKE 'bytea%';
在远程数据库执行命令。
SELECT dblink_exec(connname, sql_statement [, fail_on_error]); SELECT dblink_exec(connstr, sql_statement) [, fail_on_error]; SELECT dblink_exec(sql_statement [, fail_on_error]);
在远程数据库打开游标。
SELECT dblink_open(cursorname, sql_statement [, fail_on_error]); SELECT dblink_open(connname, cursorname, sql_statement [, fail_on_error]);
在远程数据库从打开的游标返回行。
SELECT dblink_fetch(cursorname, howmany [, fail_on_error]) SELECT dblink_fetch(connname, cursorname, howmany [, fail_on_error])
在远程数据库关闭游标。
SELECT dblink_close(cursorname [, fail_on_error]); SELECT dblink_close(connname, cursorname [, fail_on_error]);
返回所有打开的命名dblink连接的名称。
SELECT dblink_get_connections();
查询指定连接最近的错误消息。
SELECT dblink_error_message(connname);
向远程数据库发送一个异步查询。
SELECT dblink_send_query(connname, sql_statement);
检查连接是否正在忙于一个异步查询。
SELECT dblink_is_busy(connname);
检索连接上的异步通知。
SELECT dblink_get_notify(); SELECT dblink_get_notify(connname);
获取异步查询结果。
SELECT dblink_get_result(connname[, fail_on_error]);
取消连接上运行的所有查询。
SELECT dblink_cancel_query(connname);
查询远程数据库表的主键。
SELECT dblink_get_pkey(relname)
删除 dblink 扩展。
DROP EXTENSION dblink;
参数说明
connname
连接名称,可自定义。
connstr
连接信息,例如:hostaddr=172.16.103.92 port=6036 dbname=vastbase user=vastbase password='Bigdata@123'
fail_on_error
布尔值,设置为 True 表示远端如果发生错误,则也会返回到本地;如果设置为 False,远端的错误则会返回提示,函数返回值为 ERROR。
cursorname
打开的游标名称。
sql_statement
执行的语句。
relname
远端表名。
示例
示例1: 常用函数操作。
1、创建扩展。
create extension dblink;
2、先执行dblink_connect保持连接。
SELECT dblink_connect('mycoon','hostaddr=172.16.103.92 port=6036 dbname=vastbase user=lst password=Bigdata@123');
3、执行BEGIN命令。
SELECT dblink_exec('mycoon', 'BEGIN');
4、执行数据操作。
SELECT dblink_exec('mycoon', 'create table people(id int,info varchar(10))');
SELECT dblink_exec('mycoon', 'insert into people values(1,''foo'')');
SELECT dblink_exec('mycoon', 'insert into people values(2,''foo'')');
SELECT dblink_exec('mycoon', 'update people set info=''bar'' where id=1');
5、执行事务提交。
SELECT dblink_exec('mycoon', 'COMMIT');
6、执行查询。
select * from dblink('mycoon','select * from people') as testTable (id int,info varchar(10));
7、解除连接。
SELECT dblink_disconnect('mycoon')
示例2:使用dblink_exec函数执行事务提交。
1.执行dblink_connect保持连接。
SELECT dblink_connect('mycoon','hostaddr=172.16.103.92 port=64324 dbname=postgres user=vastbase password="Bigdata@123"');
2.执行BEGIN命令
SELECT dblink_exec('mycoon', 'BEGIN');
3.执行数据操作
SELECT dblink_exec('mycoon', 'create table people(id int,info varchar(10))');
SELECT dblink_exec('mycoon', 'insert into people values(1,''foo'')');
SELECT dblink_exec('mycoon', 'insert into people values(2,''foo'')');
SELECT dblink_exec('mycoon', 'update people set info=''bar'' where id=1');
4.执行事务提交
SELECT dblink_exec('mycoon', 'COMMIT');
5.执行查询
select * from dblink('mycoon','select * from people') as testTable (id int,info varchar(10));
6.解除连接
SELECT dblink_disconnect('mycoon');