我将把一个巨大记录表从一个DB更新到另一个DB。
我在这里使用光标功能:
CREATE OR REPLACE FUNCTION Drug("Drug" text)
RETURNS void AS
$BODY$
DECLARE
curs refcursor;
rec record;
BEGIN
OPEN curs FOR EXECUTE 'SELECT * FROM ' || quote_ident("Drug") FOR UPDATE;
LOOP
FETCH NEXT FROM curs INTO rec;
EXIT WHEN rec IS NULL;
RAISE NOTICE '%', rec."Id";
EXECUTE format('update statement with dblink', tbl)
USING rec.ctid;
END LOOP;
END
$BODY$ LANGUAGE plpgsql;
这是正确的吗?......或任何其他......
请建议......
答案 0 :(得分:0)
我所知道的dblink不支持游标 - 游标不能成为查询参数(PostgreSQL中的游标非常小心,通常仅限于事务)。所以这个想法是错误的。您可以生成行更新 - 但速度很慢。
你能做什么。您可以使用FDW API(外部数据包装API)并创建永久链接(外部表到第二个数据库)。然后,您可以将通常的UPDATE
语句发送到第二个数据库。
我有两个数据库db1
和db2
。 db1
是源数据库,db2
是目标数据库:
-- all is executed on db2
CREATE EXTENSION postgres_fdw;
CREATE SERVER db1 FOREIGN DATA WRAPPER postgres_fdw OPTIONS (dbname 'db1');
CREATE USER MAPPING FOR pavel
SERVER db1 OPTIONS (user 'pavel');
CREATE FOREIGN TABLE db1_source(a int, b int)
SERVER db1 OPTIONS (table_name 'source');
现在我有一个FDW表db1_source,我可以做UPDATE:
db2=# UPDATE target SET b = db1_source.b
FROM db1_source WHERE target.a = db1_source.a;
这是如何根据其他数据库中的数据进行UPDATE最有效的方法