执行Stored Procedure时触发relation does not exist 42P01错误求解决
问题解决:PostgreSQL存储过程报"relation不存在"错误
错误原因分析
你遇到的42P01错误,核心问题出在两个地方:
pg_relation_size函数只传入了表名,未指定schema。PostgreSQL会默认在当前会话的search_path里查找表,若search_path未包含myschema,就找不到该schema下的表,刚好第一个表触发了这个问题。- 关联
pg_class时仅匹配relname,未限定schema,可能会匹配到其他schema的同名表,导致逻辑混乱。
修复方案
1. 给表名加上schema前缀
调用pg_relation_size时,传入带schema的完整表名,用format函数可安全处理含特殊字符的标识符。
2. 修正pg_class的关联逻辑
通过pg_namespace关联到指定schema,确保获取的是myschema下的表信息。
修改后的存储过程代码
CREATE OR REPLACE PROCEDURE schem.myprocedure() LANGUAGE plpgsql AS $procedure$ declare sessionPid numeric = pg_backend_pid(); BEGIN begin raise notice 'schem.myprocedure();'; insert into myschema.t_tables (tablename, sizemb, rowcounts, created) SELECT ist.table_name as tablename, (pg_relation_size(format('%I.%I', ist.table_schema, ist.table_name)) / 1024 / 1024) as sizemb, pc.reltuples as rowcounts, NOW() FROM information_schema.tables ist left join pg_class pc on pc.relname = ist.table_name left join pg_namespace ns on ns.oid = pc.relnamespace and ns.nspname = ist.table_schema WHERE ist.table_schema = 'myschema'; exception when others then raise notice ' >> Error for schem.myprocedure()>> % %', sqlerrm, sqlstate; end ; END; $procedure$;
额外验证点
- 可先执行
SHOW search_path;查看当前会话的搜索路径,若未包含myschema,可临时执行SET search_path TO myschema, public;测试,但上述修复已无需依赖search_path,更稳妥。
内容的提问来源于stack exchange,提问作者Henry
相关产品推荐
相关产品推荐

