PostgreSQL中单个函数内调用多个函数仅第一个生效如何解决
问题原因
- 你的代码中不需要使用
EXECUTE执行无动态拼接需求的固定函数调用,多余的EXECUTE不会带来收益还会增加开销。 - 核心逻辑问题:
clear_mytable2是返回TABLE类型的集合返回函数,而你定义的func_test返回值为void,PL/pgSQL中如果没有显式的返回逻辑,函数内部调用集合返回函数产生的结果会被直接丢弃。你观察到的"只有第一个函数生效",本质是第一个函数如果是DML操作你可以通过表数据变化感知到执行结果,第一个函数为集合返回函数时,你刚好能捕获到被客户端返回的唯一结果集,并非第二个函数没有执行。
解决方案
根据你的使用需求分为两种场景:
场景1:不需要返回clear_mytable2的查询结果,仅需执行两个函数的所有逻辑
使用PERFORM关键字执行不需要接收返回结果的函数,去掉多余的EXECUTE即可,修改后代码如下:
CREATE OR REPLACE FUNCTION func_test() returns void as $func$ BEGIN PERFORM insert_stagging(); PERFORM clear_mytable2(); END $func$ LANGUAGE plpgsql;
修改后两个函数的内部逻辑都会正常执行,insert_stagging的插入操作会正常生效,clear_mytable2如果包含写逻辑也会正常执行,只是它的查询结果不会返回给客户端。
场景2:需要同时执行插入逻辑,并且获取clear_mytable2的查询结果
将func_test的返回值修改为和clear_mytable2一致的TABLE类型,显式声明返回逻辑即可:
CREATE OR REPLACE FUNCTION func_test() RETURNS TABLE(data1 text) as $func$ BEGIN PERFORM insert_stagging(); RETURN QUERY SELECT * FROM clear_mytable2(); END $func$ LANGUAGE plpgsql;
修改后调用SELECT * FROM func_test();,即可同时触发insert_stagging的插入操作,并且拿到clear_mytable2返回的所有数据。
内容的提问来源于stack exchange,提问作者The Joker
相关产品推荐
相关产品推荐

