UPPDATERA :Se denna utmärkta handledning för en förklaring av hur man hämtar och hanterar refkursorer.
Eftersom node-postgres inte känner igen de referenser som du returnerar som resultatuppsättningshandtag, verkar det troligt att det inte stöder flera resultatuppsättningar från PostgreSQL. Det är rättvist nog eftersom PostgreSQL inte heller har stöd för flera resultatuppsättningar, de är bara emulerade med refkursorer.
Du kan FETCH
från en refcursor
via markörkommandon på SQL-nivå markörkommandon på SQL-nivå
, även om dokumentationen för det är bedrövlig. Du behöver inte använda PL/PgSQL
markörhantering för att göra det. Bara:
FETCH ALL FROM "<unnamed portal 1>";
Notera de dubbla citattecken, som är viktiga. Ersätt referensnamnet som returneras från din funktion för <unnamed portal 1>
.
Observera också att transaktionen som skapade refkursorn fortfarande måste vara öppen om inte markören skapades WITH HOLD
. Icke-HOLD
markörerna stängs när transaktionen genomförs eller rullas tillbaka.
Till exempel, med tanke på den dummy-refkursorreturerande 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 returnerar en uppsättning markörer, kan du få resultaten genom att skicka portalnamnen till FETCH
, t.ex.:
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=#