首页 > 解决方案 > 在 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$;

以上是我的函数,我想执行上述函数中的所有记录集。

标签: postgresql

解决方案


你得到所有的游标

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;

推荐阅读