Postgres-SQL 状态:22004-EXECUTE 的查询字符串参数为空

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 对执行字符串进行硬编码,则脚本可以正常工作。下面的链接是类似的,但我认为它没有解决我的问题。谢谢您的帮助。

类似问题

Cra*_*ger 5

好吧,很明显你要连接的东西是空的。

改用该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)