АКТУАЛИЗАЦИЯ :Вижте този отличен урок за обяснение как да извличате и управлявате рекурсори.
Тъй като node-postgres не разпознава рекурсорите, които връщате като манипулатори на набор от резултати, изглежда вероятно той да не поддържа множество набори от резултати от PostgreSQL. Това е достатъчно справедливо, тъй като PostgreSQL всъщност не поддържа и множество набори от резултати, те просто се емулират с рекурсори.
Можете да FETCH
от refcursor
чрез команди за курсор на SQL ниво Команди за курсор на SQL ниво
, въпреки че документацията за него е мизерна. Не е необходимо да използвате PL/PgSQL
работа с курсора, за да го направите. Просто:
FETCH ALL FROM "<unnamed portal 1>";
Обърнете внимание на двойните кавички, които са важни. Заменете името на рекурсора, върнато от вашата функция за <unnamed portal 1>
.
Имайте предвид също, че транзакцията, която е създала рефкурсора, все още трябва да е отворена, освен ако курсорът не е създаден WITH HOLD
. Не е HOLD
курсорите се затварят, когато транзакцията се ангажира или върне назад.
Например като се има предвид фиктивната функция за връщане на рефкурсор:
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';
... който връща набор от курсори, можете да получите резултатите, като подадете имената на портала към FETCH
, напр.:
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=#