AGGIORNAMENTO :Vedi questo eccellente tutorial per una spiegazione su come recuperare e gestire i recursor.
Poiché node-postgres non riconosce i recursor che stai restituendo come handle di set di risultati, sembra probabile che non supporti più set di risultati da PostgreSQL. Questo è abbastanza giusto in quanto PostgreSQL non supporta nemmeno più set di risultati, sono solo emulati con recursor.
Puoi FETCH
da un refcursor
tramite comandi cursore a livello SQL Comandi cursore a livello SQL
, anche se la documentazione è miserabile. Non è necessario utilizzare PL/PgSQL
gestione del cursore per farlo. Solo:
FETCH ALL FROM "<unnamed portal 1>";
Nota le virgolette doppie, che sono importanti. Sostituisci il nome del refcursor restituito dalla tua funzione per <unnamed portal 1>
.
Si noti inoltre che la transazione che ha creato il ripensatore deve essere ancora aperta a meno che il cursore non sia stato creato WITH HOLD
. Non HOLD
i cursori vengono chiusi quando la transazione esegue il commit o il rollback.
Ad esempio, data la funzione fittizia di restituzione del ricursore:
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';
... che restituisce una serie di cursori, puoi ottenere i risultati passando i nomi del portale a FETCH
, ad esempio:
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=#