Postgresql:存储函数中的 dblink
Posted
技术标签:
【中文标题】Postgresql:存储函数中的 dblink【英文标题】:Postgresql: dblink in Stored Functions 【发布时间】:2011-05-27 06:17:55 【问题描述】:我想将 db_A 中的表 tbl_A 中的前 20 行插入到 db_B 中的 tbl_B。 tbl_A 和 tbl_B 的架构是:
CREATE TABLE <tbl_name> (
id serial PRIMARY KEY,
int a,
int b
);
我有一些与以下查询相关的问题
psql db_A
SELECT dblink_connect("dbname=db_B");
SELECT dblink_open('curse', 'SELECT id, a, b FROM tbl_B');
INSERT INTO tbl_A (SELECT id, a, b FROM dblink_fetch('curse', 20) AS (s_is int, s_a int, s_b int)) RETURNING a;
能否将以下语句放入存储过程中:
是否可以将以上三个语句组合在一起创建一个存储过程,并创建该过程的准备语句。
如果有人能评论使用游标或在存储过程中使用 dblink 或任何其他更优雅地实现上述方法的做法有多好,我将不胜感激。
【问题讨论】:
【参考方案1】:有更简单的方法:
连接到 db_B 并执行以下命令:
CREATE OR REPLACE FUNCTION dblink(text, text)
RETURNS SETOF record AS
'$libdir/dblink', 'dblink_record'
LANGUAGE 'c' VOLATILE STRICT
COST 1
ROWS 1000;
ALTER FUNCTION dblink(text, text) OWNER TO postgres;
GRANT EXECUTE ON FUNCTION dblink(text, text) TO public; -- or whatever
INSERT INTO tbl_B select * from
(SELECT * from dblink('hostaddr=localhost port=5432 dbname=db_A user=postgres password=postgres',
'select id, a, b from tbl_A limit 20 '
)
t(
id integer,
a integer,
b integer
)) as q;
【讨论】:
是否可以在dblink的帮助下更新过程中的查询? 请考虑您将在最后一个参数中以 SQL 形式调用“dblink”函数编写的任何内容,该函数应在远程数据库上执行。以上是关于Postgresql:存储函数中的 dblink的主要内容,如果未能解决你的问题,请参考以下文章
错误:使用 PostgreSQL 9.3 的 dblink 中的函数需要列定义列表
postgresql - 计划将数据从 dblink 插入到本地表中