postgresql - 在 PostgreSQL 中使用 refcursor 返回多个记录集
问题描述
-- FUNCTION: public.asyncmultiplerecs()
-- DROP FUNCTION public.asyncmultiplerecs();
CREATE OR REPLACE FUNCTION public.asyncmultiplerecs()
RETURNS SETOF refcursor
LANGUAGE 'plpgsql'
COST 100.0
AS $function$
DECLARE
ref1 refcursor; -- Declare cursor variables
ref2 refcursor;
ref3 refcursor;
ref4 refcursor;
BEGIN
OPEN ref1 FOR SELECT bk_channel_id,promotion_id FROM cs_promotion_offer_exclusions;
RETURN NEXT ref1;
OPEN ref2 FOR SELECT mastergroup,promo_grp_id FROM cs_promotion_group_master;
RETURN NEXT ref2;
OPEN ref3 FOR SELECT promotion_usoc,promotion_duration FROM cs_promotion_target_details;
RETURN NEXT ref2;
OPEN ref4 FOR SELECT promotion_id,offer_id FROM cs_promotion_details;
RETURN NEXT ref4;
END;
$function$;
以上是我的函数,我想执行上述函数中的所有记录集。
解决方案
你得到所有的游标
SELECT * FROM asyncmultiplerecs();
然后您使用FETCH
从游标中获取结果。
您忘记为游标指定名称,因此它们将未命名。
这是一个完整的例子,如何做到这一点:
CREATE FUNCTION asyncmultiplerecs() RETURNS SETOF refcursor
LANGUAGE plpgsql AS
$$DECLARE
ref1 refcursor;
BEGIN
ref1 := 'c1';
OPEN ref1 FOR VALUES (1), (2);
RETURN NEXT ref1;
ref1 := 'c2';
OPEN ref1 FOR VALUES (3), (4);
RETURN NEXT ref1;
END;$$;
现在您必须在事务中调用该函数,因为游标将在提交时关闭:
BEGIN;
SELECT * FROM asyncmultiplerecs();
asyncmultiplerecs
-------------------
c1
c2
(2 rows)
FETCH ALL FROM c1;
column1
---------
1
2
(2 rows)
FETCH ALL FROM c2;
column1
---------
3
4
(2 rows)
COMMIT;
推荐阅读
- javascript - 如何通过浏览器从 PHP 远程执行 PhantomJS
- node.js - 登录在 Postman 中持续存在,但在使用 Angular 的浏览器中不存在
- javascript - forEach 模仿 .map() 函数
- php - 通过 PHPMailer 发送带有 CSV 附件的电子邮件
- java - 使用 armeria 或 asynchttpclient 代理大文件
- ejabberd - ejabberd muc_sub 从 ejabberd 服务器内为用户订阅房间
- javascript - 如何在 PHP 中使用 POST 方法获取 style="display:none" 值
- hazelcast-jet - Hazelcast-Jet drainTo 语法问题
- javascript - 如何在启用 CSP 的静态网站上安装 Disqus?
- python - 仅在特定间隔内插值图