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;
$$
我在 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;
$$