UPDATE :Zie deze uitstekende tutorial voor een uitleg over het ophalen en beheren van refcursors.
Aangezien node-postgres de refcursors die u retourneert niet herkent als resultaatsethandles, lijkt het waarschijnlijk dat het niet meerdere resultatensets van PostgreSQL ondersteunt. Dat is eerlijk genoeg, aangezien PostgreSQL ook niet echt meerdere resultatensets ondersteunt, ze worden alleen geëmuleerd met refcursors.
U kunt FETCH
van een refcursor
via cursoropdrachten op SQL-niveau cursoropdrachten op SQL-niveau
, hoewel de documentatie ervoor ellendig is. U hoeft PL/PgSQL
niet te gebruiken cursorbehandeling om het te doen. Gewoon:
FETCH ALL FROM "<unnamed portal 1>";
Let op de dubbele aanhalingstekens, die belangrijk zijn. Vervang de refcursornaam die door uw functie wordt geretourneerd door <unnamed portal 1>
.
Houd er ook rekening mee dat de transactie die de refcursor heeft gemaakt, nog steeds open moet zijn, tenzij de cursor is gemaakt WITH HOLD
. Niet-HOLD
cursors worden gesloten wanneer de transactie wordt uitgevoerd of teruggedraaid.
Bijvoorbeeld, gegeven de dummy refcursor-terugkerende functie:
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 een set cursors retourneert, kunt u de resultaten krijgen door de portalnamen door te geven aan FETCH
, bijvoorbeeld:
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=#