ATUALIZAÇÃO :Veja este excelente tutorial para uma explicação de como buscar e gerenciar refcursors.
Como o node-postgres não está reconhecendo os refcursors que você está retornando como identificadores do conjunto de resultados, parece provável que ele não suporte vários conjuntos de resultados do PostgreSQL. Isso é justo, pois o PostgreSQL também não suporta vários conjuntos de resultados, eles são apenas emulados com refcursors.
Você pode
FETCH
de um refcursor
por meio de comandos de cursor em nível SQL comandos de cursor em nível SQL
, embora a documentação seja miserável. Você não precisa usar PL/PgSQL
manipulação do cursor para fazê-lo. Apenas:FETCH ALL FROM "<unnamed portal 1>";
Observe as aspas duplas, que são importantes. Substitua o nome do refcursor retornado de sua função para
<unnamed portal 1>
. Observe também que a transação que criou o refcursor ainda deve estar aberta, a menos que o cursor tenha sido criado
WITH HOLD
. Não HOLD
os cursores são fechados quando a transação é confirmada ou revertida. Por exemplo, dada a função de retorno de refcursor fictícia:
CREATE OR REPLACE FUNCTION dummy_cursor_returning_fn() RETURNS SETOF refcursor AS $$
DECLARE
curs1 refcursor;
curs2 refcursor;
BEGIN
OPEN curs1 FOR SELECT generate_series(1,4);
OPEN curs2 FOR SELECT generate_series(5,8);
RETURN NEXT curs1;
RETURN NEXT curs2;
RETURN;
END;
$$ LANGUAGE 'plpgsql';
... que retorna um conjunto de cursores, você pode obter os resultados passando os nomes do portal para
FETCH
, por exemplo:regress=# BEGIN;
BEGIN
regress=# SELECT dummy_cursor_returning_fn();
dummy_cursor_returning_fn
---------------------------
<unnamed portal 7>
<unnamed portal 8>
(2 rows)
regress=# FETCH ALL FROM "<unnamed portal 7>";
generate_series
-----------------
1
2
3
4
(4 rows)
regress=# FETCH ALL FROM "<unnamed portal 8>";
generate_series
-----------------
5
6
7
8
(4 rows)
regress=#