AKTUALIZUJ :zobacz ten doskonały samouczek po wyjaśnienie, jak pobrać i zarządzać refcursorami.
Ponieważ node-postgres nie rozpoznaje refcursorów, które zwracasz jako uchwyty zestawu wyników, wydaje się prawdopodobne, że nie obsługuje wielu zestawów wyników z PostgreSQL. To wystarczająco sprawiedliwe, ponieważ PostgreSQL tak naprawdę nie obsługuje wielu zestawów wyników, są one po prostu emulowane za pomocą refcursorów.
Możesz FETCH
z refcursor
za pomocą poleceń kursora na poziomie SQL Polecenia kursora na poziomie SQL
, chociaż dokumentacja do tego jest nieszczęśliwa. Nie musisz używać PL/PgSQL
obsługi kursora, aby to zrobić. Tylko:
FETCH ALL FROM "<unnamed portal 1>";
Zwróć uwagę na podwójne cudzysłowy, które są ważne. Zastąp nazwę refcursor zwróconą z funkcji dla <unnamed portal 1>
.
Zauważ również, że transakcja, która utworzyła refcursor musi być nadal otwarta, chyba że kursor został utworzony WITH HOLD
. Bez HOLD
kursory są zamykane, gdy transakcja zostanie zatwierdzona lub wycofana.
Na przykład, biorąc pod uwagę fikcyjną funkcję zwracającą refcursor:
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';
... który zwraca zestaw kursorów, możesz uzyskać wyniki, przekazując nazwy portali do FETCH
, np.:
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=#