如何使用update语句和db link在postgresql中编写游标

如何使用update语句和db link在postgresql中编写游标,postgresql,Postgresql,我将把巨大记录表从一个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

我将把巨大记录表从一个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;
这是正确的吗?。。。或任何其他


请建议…

据我所知,dblink不支持游标-游标不能作为查询的参数PostgreSQL中的游标非常小心,通常仅限于事务。所以这个想法是错误的。您可以生成行更新,但速度会很慢

你能做什么。您可以使用外部数据包装器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_源,可以进行更新:

db2=# UPDATE target SET b = db1_source.b 
         FROM db1_source WHERE target.a =  db1_source.a;
这是基于其他数据库中的数据进行更新的最有效的方法