PostgreSQL存储过程创建临时表后查询提示表不存在问题求助
问题原因
PostgreSQL的sql语言存储过程会在创建阶段就完成所有语句的全量语义校验,此时你脚本里的newtemptable还未实际创建,因此校验直接失败,抛出relation "newtemptable" does not exist的错误。
解决方案
最通用的解决方式是将存储过程的语言改为plpgsql,PL/pgSQL采用惰性解析机制,只会在执行到对应语句时才校验对象存在性,完全适配「先创建临时表、后查询使用」的逻辑。
修改后的存储过程示例如下:
CREATE OR REPLACE PROCEDURE sp_getworkflow() LANGUAGE plpgsql AS $BODY$ BEGIN -- 先删再建避免重复调用时表已存在的报错,不需要可以删除这行 DROP TABLE IF EXISTS newtemptable; CREATE TEMP TABLE newtemptable AS SELECT "TXNID", "FILENAME" FROM "oldtable" WHERE "TXNID" = 'abc'; -- 若需要返回查询结果可以用RETURN QUERY,或者直接写后续业务逻辑 RETURN QUERY SELECT * FROM "newtemptable"; END; $BODY$;
补充说明
- 临时表是会话级别的,仅在创建它的数据库会话中可见,会话断开后会自动删除
- 如果你需要在同一会话的其他存储过程/语句中使用这个临时表,只要在
sp_getworkflow调用完成后再引用即可,不需要重复创建
内容的提问来源于stack exchange,提问作者user3363190
相关产品推荐
相关产品推荐

