Возврат множественных наборов записей с использованием refcursor в PostgreSQL - PullRequest
0 голосов
/ 02 июля 2018
-- 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$;

Выше моя функция, я хочу выполнить все наборы записей из вышеуказанной функции.

1 Ответ

0 голосов
/ 02 июля 2018

Вы получаете все курсоры с

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...