You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 08:20:32