PostgreSQL13返回表结果存储过程调用报42601错误如何解决
问题产生原因
- 在PostgreSQL的PL/pgSQL语法中,存储过程内部的
SELECT语句必须指定查询结果的接收目标(比如变量、临时表),你当前的代码直接执行SELECT * FROM public.message_template没有声明结果的去向,数据库无法判断你是要丢弃结果还是返回结果,因此抛出该错误。 - 提示中提到的
PERFORM仅适用于不需要获取查询返回值、仅执行查询逻辑的场景,不符合你要返回表查询结果的需求。 - PostgreSQL的
PROCEDURE(存储过程)本身设计偏向处理事务、数据变更类无返回结果的逻辑,要直接返回结果集使用FUNCTION(函数)是更适配的方案。
解决方案
最常用的实现方式是将存储过程改写为返回结果集的函数,示例代码如下:
create or replace function public.sp_message_template_get( templateid int ) returns setof public.message_template language plpgsql AS $$ begin -- 可根据你的业务需求调整WHERE条件,过滤指定templateid对应的数据 return query select * from public.message_template where id = templateid; end; $$;
调用方式不再使用CALL,改为直接查询函数即可拿到返回的表结果:
select * from public.sp_message_template_get(1);
如果确实需要使用存储过程实现,也可以通过REF CURSOR类型的输出参数传递结果集,不过调用复杂度更高,非必要场景优先使用上述函数方案即可。
内容的提问来源于stack exchange,提问作者VAAA
相关产品推荐
相关产品推荐

