PostgreSQL如何编写执行select查询的存储过程?调用返回空白怎么解决
问题原因
- PostgreSQL中,使用
sql语言定义的存储过程(PROCEDURE)内部执行的SELECT查询结果不会默认返回给调用方,执行完成后结果会直接丢弃,这是你调用后无数据返回的核心原因。 - 存储过程本身设计定位偏向于执行数据修改、事务控制类逻辑,如果你需要直接返回查询结果集,使用函数(FUNCTION)是更贴合的方案。
解决方法
下面提供两种适配不同场景的解决方案:
方案1:改用SQL函数实现(推荐,适配纯查询返回结果的场景)
直接定义返回表结构的SQL函数,调用时用SELECT即可拿到结果集,代码如下:
-- 创建函数,返回值类型为employees表的行集合 CREATE OR REPLACE FUNCTION public.get_employees_by_salary_10000() RETURNS SETOF employees LANGUAGE sql AS $BODY$ SELECT * FROM employees WHERE salary = 10000; $BODY$; -- 调用函数获取结果 SELECT * FROM public.get_employees_by_salary_10000();
方案2:使用带游标参数的存储过程实现(适配必须用存储过程的场景)
如果你后续需要在该逻辑中加入事务控制、多步修改操作,必须用存储过程实现,可以通过返回游标参数的方式带回查询结果,代码如下:
CREATE OR REPLACE PROCEDURE public.deactivate_unpaid_accounts(INOUT result_cursor refcursor) LANGUAGE plpgsql AS $BODY$ BEGIN -- 打开游标绑定查询结果 OPEN result_cursor FOR SELECT * FROM employees WHERE salary = 10000; END; $BODY$; -- 调用存储过程获取结果的方式 BEGIN; CALL deactivate_unpaid_accounts('result_cur'); FETCH ALL IN "result_cur"; COMMIT;
额外说明:你当前的存储过程命名为deactivate_unpaid_accounts,看起来是要实现停用未支付账户的逻辑,如果后续需要补充UPDATE类修改操作,修改完成后要返回受影响行的话,可以在UPDATE语句后加RETURNING *绑定到游标即可。
内容的提问来源于stack exchange,提问作者POOJA PAWAR
相关产品推荐
相关产品推荐

