PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

unterstützt node-postgres mehrere Ergebnismengen

AKTUALISIEREN :Siehe dieses ausgezeichnete Tutorial für eine Erklärung, wie Refcursoren abgerufen und verwaltet werden.

Da node-postgres die Refcursoren, die Sie als Resultset-Handles zurückgeben, nicht erkennt, scheint es wahrscheinlich, dass es nicht mehrere Resultsets von PostgreSQL unterstützt. Das ist fair genug, da PostgreSQL mehrere Ergebnismengen auch nicht wirklich unterstützt, sie werden nur mit Refkursoren emuliert.

Sie können FETCH aus einem refcursor über Cursorbefehle auf SQL-Ebene Cursorbefehle auf SQL-Ebene , obwohl die Dokumentation dafür miserabel ist. Sie müssen PL/PgSQL nicht verwenden Cursor-Handhabung, um es zu tun. Nur:

FETCH ALL FROM "<unnamed portal 1>";

Beachten Sie die doppelten Anführungszeichen, die wichtig sind. Ersetzen Sie <unnamed portal 1> durch den von Ihrer Funktion zurückgegebenen Refcursor-Namen .

Beachten Sie auch, dass die Transaktion, die den Refcursor erstellt hat, immer noch geöffnet sein muss, es sei denn, der Cursor wurde WITH HOLD erstellt . Nicht-HOLD Cursor werden geschlossen, wenn die Transaktion festgeschrieben oder zurückgesetzt wird.

Zum Beispiel angesichts der Dummy-Refcursor-Rückgabefunktion:

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';

... die eine Reihe von Cursorn zurückgibt, können Sie die Ergebnisse erhalten, indem Sie die Portalnamen an FETCH übergeben , zB:

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