Как получить несколько курсоров из одного курсора OUT - PullRequest
0 голосов
/ 03 августа 2020

У меня есть такая функция:

CREATE OR REPLACE FUNCTION get_request
(IN p_id TEXT, 
OUT c_request REFCURSOR)
AS 
$BODY$
BEGIN

DECLARE 

    cur_1 CURSOR FOR select id, title, doc_url, icon_url
                      from request_attachments
                      where request_attachments.id = requests.id;
        
    cur_2 CURSOR FOR  select users.id user_id, 
                              users.name user_name, 
                              users.email user_email,
                              users.picture_url user_picture, 
                              request_comments.ts, 
                              request_comments."comment"
                        from request_comments, users
                        where request_comments.id = p_id and request_comments.user_id = users.id
                        order by request_comments.id desc, request_comments.ts desc;
        

BEGIN
open c_request for
    select requests.center_id, 
    cur_1 attachments,
    cur_2 comments
    from requests
    where id = p_id;
    
END;
END;
$BODY$
LANGUAGE plpgsql;

И я хотел бы получать значения из курсоров, которые определены внутри курсора c_request в этой функции. Я написал примерно так:

c_kur = get_request('some id here');
loop
  fetch c_kur into r_kur;
  IF NOT FOUND THEN EXIT; END IF;



    c_kur2 = r_kur.cur_1;
    loop
      fetch c_kur2 into r_kur2;
      IF NOT FOUND THEN EXIT; END IF;
      raise info 'user_id: %, comment: %', r_kur2.user_id, r_kur2."comment";  --THIS IS WHERE I WANT TO SEE THOSE VALUES
    end loop;




end loop;
close c_kur;

Но вроде не работает. Как получить значения cur_1 и cur_2 из этой функции во вложенном l oop, как указано выше?

Я получаю эту ошибку:

NOTICE:  cursor "cur_1" does not exist 34000

1 Ответ

0 голосов
/ 06 августа 2020

Никто не смог мне помочь, но я решил эту проблему, полностью переписав эту функцию. Теперь у меня есть две дополнительные «вспомогательные» функции, которые возвращают курсоры отдельно, и эта основная функция get_request возвращает только курсор c_request без курсоров cur_1 и cur_2 (они обрабатываются вспомогательными функциями).

Он работает медленнее, но он работает. ;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...