PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

node-postgres supporta più set di risultati

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=#