Maj*_*juS 3 postgresql postgis execute dynamic-sql plpgsql
我有一个表(名为 VGI_table),其中包含一个列(名为 match_tabl),其中包含同一数据库中其他表的名称以及这些表的 object_ids。我正在尝试创建一个 plpgsql 函数,该函数遍历 VGI_table 中的每一行并执行查询以从另一个表中检索对象,如下所示。
该函数有 4 个参数(都是 varchar),前两个是 VGI_table 中的列名,第三个是 VGI_table 的名称,最后一个参数是输出。
vgi_match_id_col, vgi_match_table_col, vgi_table, output_table
Run Code Online (Sandbox Code Playgroud)
该函数的代码如下所示,ro 用于保存第一个表查询,match_row 保存查询的外部表的输出。距离是使用 PostGIS st_distance 函数创建的输出。
DECLARE
ro record;
match_row record;
distance float;
BEGIN
for ro in EXECUTE 'select gid, geom, '||vgi_match_id_col||' as match_id, '||vgi_match_table_col||' as match_table from '||vgi_table
LOOP
--raise notice '(%)', 'select geom from public.'||ro.match_table||' where gid = '||ro.match_id;
execute 'select geom from public.'||ro.match_table||' where gid = '||ro.match_id into match_row;
distance := st_distance(ro.geom, st_transform(match_row.geom,st_srid(ro.geom)));
EXECUTE 'INSERT INTO '||output_table||' VALUES('||ro.gid||', '||distance||')';
END LOOP;
Run Code Online (Sandbox Code Playgroud)
被查询的表在 match_tabl 列或 object_id 列中没有空值。代码在尝试执行 EXECUTE 语句时将 ro.match_table 和 ro.match_id 标识为空值。我什至将 RAISE NOTICE 函数与 EXECUTE 语句中使用的相同字符串一起使用,并返回正确的查询。如果我使用预定义的 table_name 和对象 id 对执行字符串进行硬编码,则脚本可以正常工作。下面的链接是类似的,但我认为它没有解决我的问题。谢谢您的帮助。
好吧,很明显你要连接的东西是空的。
改用该format函数,这样您将获得更多有用的信息。
format('select geom from public.%I ....', ro.match_table);
Run Code Online (Sandbox Code Playgroud)
使用EXECUTE ... USING ...插入文字。
例如
EXECUTE format('INSERT INTO %I VALUES($1, $2)', output_table) USING (ro.gid, distance);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7562 次 |
| 最近记录: |