AKTUALIZACE :Viz tento vynikající návod pro vysvětlení, jak načítat a spravovat rekurzory.
Protože node-postgres nerozpoznává rekurzory, které vracíte jako úchyty sady výsledků, zdá se pravděpodobné, že nepodporuje více sad výsledků z PostgreSQL. To je dost fér, protože PostgreSQL ve skutečnosti také nepodporuje více sad výsledků, jsou pouze emulovány pomocí rekurzorů.
Můžete FETCH
z refcursor
prostřednictvím příkazů kurzoru na úrovni SQL příkazy kurzoru na úrovni SQL
, i když dokumentace k tomu je mizerná. Nemusíte používat PL/PgSQL
manipulaci s kurzorem. Jen:
FETCH ALL FROM "<unnamed portal 1>";
Všimněte si dvojitých uvozovek, které jsou důležité. Nahraďte název rekurzoru vrácený vaší funkcí pro <unnamed portal 1>
.
Všimněte si také, že transakce, která vytvořila rekurzor, musí být stále otevřená, pokud nebyl kurzor vytvořen WITH HOLD
. Jiné než HOLD
kurzory se zavřou, když se transakce potvrdí nebo vrátí zpět.
Například s ohledem na funkci vracení falešného rekurzoru:
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';
... který vrací sadu kurzorů, můžete získat výsledky předáním názvů portálu do FETCH
, např.:
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=#