我检查了我使用并完美运行的以下链接。但我想反对这件事。
我的场景:有两个数据库。我想将一个表数据从本地复制到远程数据库。我为此使用了 dblink,但我很困惑如何使用 dblink 来存储数据?
本地数据库名称:localdatabase
远程数据库名称:remotedatabase
任何人都可以建议我如何做到这一点?
提前致谢。
我检查了我使用并完美运行的以下链接。但我想反对这件事。
我的场景:有两个数据库。我想将一个表数据从本地复制到远程数据库。我为此使用了 dblink,但我很困惑如何使用 dblink 来存储数据?
本地数据库名称:localdatabase
远程数据库名称:remotedatabase
任何人都可以建议我如何做到这一点?
提前致谢。
类似下面几行的东西应该可以工作:
SELECT dblink_connect('hostaddr=127.0.0.1 port=5432 dbname=mydb user=postgres password=mypasswd');
-- change the connection string to your taste
SELECT dblink_exec('INSERT INTO test (some_text) VALUES (''Text go here'');');
test
远程数据库中具有以下定义的表在哪里:
CREATE TABLE test(
id serial
, some_text text
);
运行后dblink_exec()
,您可以在远程数据库中检查结果(或在本地,使用dblink()
,如下例所示)。
SELECT * FROM dblink('SELECT id, some_text FROM test') AS d(id integer, some_text text);
id | some_text
----+--------------
1 | Text go here
(1 row)
您也可以将dblink_exec
调用包装在一个函数中:
CREATE OR REPLACE FUNCTION f_dblink_test_update(val text, id integer) RETURNS text AS
$body$
SELECT dblink_exec('UPDATE torles.test SET some_text=' || quote_literal($1) || ' WHERE id = ' || $2);
$body$
LANGUAGE sql;
如您所见,您甚至可以动态构建查询字符串。 (并不是说我提倡这种方法,因为您必须小心不要以这种方式将 SQL 注入漏洞引入您的系统。)
由于dblink_exec
返回一个关于它做了什么的文本消息,你必须将你的函数定义为RETURNS text
除非在调用之后还有其他返回值的语句dblink_exec
。