OPDATERING :Se denne fremragende selvstudie for en forklaring på, hvordan man henter og administrerer refkursorer.
Da node-postgres ikke genkender de refcursorer, du returnerer som resultatsæt-håndtag, virker det sandsynligt, at det ikke understøtter flere resultatsæt fra PostgreSQL. Det er rimeligt nok, da PostgreSQL heller ikke rigtigt understøtter flere resultatsæt, de er blot emuleret med refkursorer.
Du kan FETCH
fra en refcursor
via markørkommandoer på SQL-niveau markørkommandoer på SQL-niveau
, selvom dokumentationen for det er elendig. Du behøver ikke bruge PL/PgSQL
markørhåndtering for at gøre det. Bare:
FETCH ALL FROM "<unnamed portal 1>";
Bemærk de dobbelte anførselstegn, som er vigtige. Substitut det refursornavn, der returneres fra din funktion, for <unnamed portal 1>
.
Bemærk også, at transaktionen, der oprettede refursoren, stadig skal være åben, medmindre markøren blev oprettet WITH HOLD
. Ikke-HOLD
markører lukkes, når transaktionen forpligtes eller rulles tilbage.
For eksempel givet dummy-refcursor-retur-funktionen:
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';
... som returnerer et sæt markører, kan du få resultaterne ved at sende portalnavnene til FETCH
, f.eks.:
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=#