Postgresql:从 dblink() 的函数调用更新记录:语法错误

Postgresql: Update Records from a Function Calls from dblink(): Syntax Error

我在 joa_clinic table 中有一个 precalc_isochrones_5_miles 字段,需要根据来自另一个数据库的 drivetime_isochrones_IRFAN 函数的 return 进行更新。我能够使用 dblink 建立跨数据库连接,并且我在循环中使用以下内容将四个参数传递给 drivetime_isochrones_IRFAN 函数。该函数将 return the_geom_isochrone 几何值。

do
$$
declare
    f record;
begin
    for f in SELECT clinic_long, clinic_lat FROM joa_clinics
    loop    
    UPDATE joa_clinics SET precalc_isochrones_5_miles = the_geom_isochrone FROM
     SELECT the_geom_isochrone FROM dblink('myconn', format('SELECT  the_geom_isochrone FROM  drivetime_isochrones_IRFAN(%L, %L, %L, %L, %L)', clinic_long,clinic_lat,8046,false) )       
    end loop;
end;
$$

但是当我 运行 这段代码时,我得到一个语法错误:

SELECT the_geom_isochrone FROM dblink('myconn', format('SE...

如何解决?注意:这是 Windows 中的 Postgresql 11 运行ning,我正在使用 pgAdmin。

谢谢!

直接的语法错误是,如果您想将 select.... 直接插入 FROM,则需要在 select.... 周围加上括号。但这仍然没有多大意义。然后,您将尝试 运行 更新 joa_clinics 的每一行(因为没有 WHERE 子句来限制它),并且 运行 更新每行一次行。

我认为您只需要一次更新,完全没有循环(因此没有 DO),并将 dblink 子查询放在赋值的 RHS 中,而不是 FROM 中。

UPDATE joa_clinics SET precalc_isochrones_5_miles = 
   (SELECT the_geom_isochrone FROM 
      dblink('mylink', 
        format('SELECT drivetime_isochrones_IRFAN(%L, %L, %L, %L, %L)', clinic_long,clinic_lat,8046,false,false)
      ) f(the_geom_isochrone geometry)
   );

现在,如果 drivetime_isochrones_IRFAN 是一个返回集合的函数,那么您可能想要一些与此不同的东西,但如果没有看到定义,就无法知道那可能是什么。

请注意,我向您的函数调用添加了一个虚拟参数,因为您的格式字符串中有 5 个占位符,因此需要 5 个额外的参数,而不是 4 个。

所以这对我有用。我已经接受了上面的@jjanes Answer,因为那将基于原始问题。但是为了我的需要,需要更新多行。我想有更好的方法来做到这一点,但我只有大约 300 多行,所以易于管理。

HTH.

do $$
declare 
f record; 
returned_geometry geometry; 
begin   
    for f in SELECT record_id, clinic_long, clinic_lat FROM joa_clinics
    loop        
        raise notice ' % | %',  f.clinic_long, f.clinic_lat;    
        select t1.the_geom_isochrone
        into returned_geometry
        from dblink('myconn', format('SELECT the_geom_isochrone FROM drivetime_isochrones_IRFAN(%L, %L, %L, %L)', f.clinic_long,f.clinic_lat,8046,false)) 
         as t1 (the_geom_isochrone geometry);
        UPDATE joa_clinics SET precalc_isochrones_5_miles = returned_geometry where joa_clinics.record_id = f.record_id;        
    end loop;
end;
$$