PostgreSQL匿名函数循环输出表信息报错:relation不存在
PostgreSQL匿名函数查询表信息报错修复
问题场景
需求是用匿名函数以「表名 | 列数 | 行数」格式输出public schema下所有基表的信息,但运行代码后触发如下错误:
ERROR: relation "table_record" does not exist
LINE 1: ...ELECT COUNT(COLUMN_NAME) FROM table_reco...
^
QUERY: SELECT COUNT(COLUMN_NAME) FROM table_record
WHERE TABLE_CATALOG = 'ucheb' AND TABLE_SCHEMA = 'public'
CONTEXT: PL/pgSQL function inline_code_block line 13 at SQL statement
SQL state: 42P01
错误原因
table_record是PL/pgSQL循环中的记录变量,不是数据库中实际存在的表对象,直接把它写在FROM子句里,PostgreSQL会将其当作表名去查找,自然找不到对应的关系。- 统计列数的逻辑错误:应该从
information_schema.columns系统视图中根据表名统计,而非从变量查询。 - 统计行数时,表名是动态变量,必须用动态SQL执行查询,不能直接写静态SQL语句。
修正后的代码
do $$ declare columns_count integer := 0; rows_count integer := 0; table_record record; begin for table_record in SELECT table_name FROM information_schema.tables WHERE table_schema='public' AND table_type='BASE TABLE' loop -- 统计当前表的列数 SELECT COUNT(column_name) INTO columns_count FROM information_schema.columns WHERE table_catalog = 'ucheb' AND table_schema = 'public' AND table_name = table_record.table_name; -- 动态SQL统计当前表的行数,%I用于安全转义表名 EXECUTE format('SELECT COUNT(*) FROM %I', table_record.table_name) INTO rows_count; raise notice '% | % | %', table_record.table_name, columns_count, rows_count; end loop; end; $$ LANGUAGE plpgsql;
关键改动说明
- 列数统计:关联
information_schema.columns系统视图,通过table_name = table_record.table_name匹配当前循环的表,实现精准统计。 - 行数统计:使用
EXECUTE执行动态SQL,format('%I', table_record.table_name)会自动处理表名的转义,避免SQL注入风险和特殊字符问题。 - 输出优化:用
table_record.table_name代替整个table_record变量,确保只输出表名字符串,符合预期格式。
内容的提问来源于stack exchange,提问作者Efobo
相关产品推荐
相关产品推荐

