PL/PgSQL存储过程sp_count_recon_refresh报42601语法错误求助
问题分析与解决
问题原因
PL/pgSQL中无法直接将变量作为表名嵌入静态SQL语句,f.tgt_tbl是存储表名字符串的变量,PostgreSQL会将其解析为f schema下的tgt_tbl表,而非你期望的动态表名,因此触发语法错误。
解决方案
使用动态SQL(EXECUTE语句)构造并执行计数查询,同时给UPDATE添加WHERE条件,确保仅更新当前循环对应的行:
create or replace procedure ca_adhoc_view.sp_count_recon_refresh() language plpgsql as $$ declare f record; res bigint; BEGIN for f in select tgt_tbl from ca_adhoc_view.recon_count1 LOOP -- 动态获取目标表行数 EXECUTE format('select count(*) from %I', f.tgt_tbl) INTO res; -- 更新对应行的计数 update ca_adhoc_view.recon_count1 set tgt_tbl_count = res where tgt_tbl = f.tgt_tbl; end loop; END; $$;
关键细节
format('%I', f.tgt_tbl):通过%I占位符自动处理特殊表名(如含空格、关键字或大小写敏感的表名),同时避免SQL注入风险。INTO res:将动态查询的结果存入变量,再用于更新操作。WHERE tgt_tbl = f.tgt_tbl:避免每次循环更新所有行,确保仅修改当前表名对应的记录。
内容的提问来源于stack exchange,提问作者Sk2415
相关产品推荐
相关产品推荐

