MISE À JOUR :Voir cet excellent tutoriel pour une explication sur la façon de récupérer et de gérer les refcurseurs.
Étant donné que node-postgres ne reconnaît pas les refcursors que vous renvoyez en tant que poignées d'ensemble de résultats, il semble probable qu'il ne prend pas en charge plusieurs ensembles de résultats de PostgreSQL. C'est assez juste car PostgreSQL ne prend pas vraiment en charge plusieurs ensembles de résultats non plus, ils sont simplement émulés avec des refcursors.
Vous pouvez FETCH
à partir d'un refcursor
via les commandes de curseur de niveau SQL Commandes de curseur de niveau SQL
, même si la documentation est misérable. Vous n'avez pas besoin d'utiliser PL/PgSQL
manipulation du curseur pour le faire. Juste :
FETCH ALL FROM "<unnamed portal 1>";
Notez les guillemets, qui sont importants. Remplacez le nom du refcursor renvoyé par votre fonction par <unnamed portal 1>
.
Notez également que la transaction qui a créé le refcursor doit toujours être ouverte à moins que le curseur n'ait été créé WITH HOLD
. Non HOLD
les curseurs sont fermés lorsque la transaction est validée ou annulée.
Par exemple, étant donné la fonction factice de retour de refcursor :
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';
... qui renvoie un ensemble de curseurs, vous pouvez obtenir les résultats en passant les noms des portails à FETCH
, par exemple :
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=#