【发布时间】:2016-02-12 05:36:37
【问题描述】:
我有一个表(名为 VGI_table),其中包含一个列(名为 match_tabl),该列包含同一数据库中其他表的名称以及这些表的 object_id。我正在尝试创建一个 plpgsql 函数,该函数循环遍历 VGI_table 中的每一行并执行查询以从另一个表中检索对象,如下所示。
该函数有4个参数(都是varchar),前两个是VGI_table中的列名,第三个是VGI_table的名字,最后一个参数是输出。
vgi_match_id_col, vgi_match_table_col, vgi_table, output_table
函数代码如下所示,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;
被查询的表在 match_tabl 列或 object_id 列中没有空值。代码在尝试执行 EXECUTE 语句时将 ro.match_table 和 ro.match_id 标识为空值。我什至将 RAISE NOTICE 函数与 EXECUTE 语句中使用的相同字符串一起使用,并返回了正确的查询。如果我使用预定义的 table_name 和对象 id 对执行字符串进行硬编码,则脚本可以正常工作。下面的链接类似,但我认为它不能解决我的问题。感谢您的帮助。
【问题讨论】:
标签: postgresql postgis plpgsql dynamic-sql execute