查看原文:http://www.hellonet8.com/1368.html
postgresql中dblink扩展的功能是可以在一个数据库中操作另外一个远程数据库。比如:一个数据库在中国北京,另外一台数据库在中国上海,我可以在北京这台数据库上面建立一个到上海数据库的dblink,然后可以在北京这台数据库上面对上海的数据库进行query或者update或者delete。
dblink的安装:章郎虫这里安装的是postgresql 9.2版本,psql进入数据库后运行create extension dblink就可以了。
dblink的使用:
1、dblink_connect
这个命令主要作用是建立一个到远程数据库的连接,比如
select dblink_connect('myconn', 'host=XXX.XXX.XXX.XXX port=XX dbname=postgres user=myname password=mypassword');
myconn表示连接名称,可以不写,不过建议还是写下连接名称。
2、dblink_disconnect
断开远程数据库连接,比如
select dblink_disconnect('myconn') ;
3、dblink_get_connections
查看当前的远程连接,直接select dblink_get_connections() ;就可以看到连接,如果{'myconn'} 。
4、dblink
这个命令意思就是执行一个远程的查询。如果远程连接成功,那么就可以在本地操作远程数据库了。
select * from dblink('myconn','select * from mytable') as t(a int, b text, c text[]) ;
查询远程数据库中mytable表中的数据,这里as后面相当于把远程数据库中的字段在本地重新命名。这个一定要写,不然dblink会报错误。
select * from dblink('myconn','select * from mytable') as t(a int, b text, c text[]) where a>XX ;
使用dblink最方便的方法是创建一个视图view。这样在查询远程数据表的时候就不用再一次输入以上信息了。比如:
create view myremote_table as select * from dblink('myconn','select * from mytable') as t(a int, b text, c text[]) ;
select * from myremote_table where a>XX ;
5、dblink_exec
执行一个不返回行的远程命令,比如insert into语句 。
select dblink_exec('myconn', 'insert into mytable values(21,''z'',''{"a0","b0","c0"}'');');
6、dblink_open、dblink_fetch和dblink_close
dblink_open:执行一个远程的命令,但是不显示,可以用之后的dblink_fetch()或者dblink_close()来操作。
dblink_fetch:返回之前用dblink_open执行命令的结果。
dblink_close:关闭之前用dblink_open执行命令的结果 。
select dblink_open('myconn','foo', 'select proname, prosrc from pg_proc where proname like ''bytea%''');
select * from dblink_fetch('myconn','foo', 5) AS (funcname name, source text);
select * from dblink_close('myconn','foo') ;
dblink_fetch中的5表示我一次只取一个结果,如果查询结果超过5个,那么再一次执行以上的dblink_fetch语句又可以取到剩下的内容,只到出现(0 rows) 。
7、dblink_error_message
得到最后出现错误的信息提示。select dblink_error_message('myconn');
8、dblink_send_query、dblink_is_busy、dblink_get_notify和dblink_get_result
这几个命令只前面的用法差不多,主要区别是执行异步的远程命令。比如:
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)
官方参考文档:http://www.postgresql.org/docs/9.2/interactive/dblink.html