更新 :この優れたチュートリアル を参照してください。 refcursorsをフェッチして管理する方法の説明については。
node-postgresは、返されるリフレクターを結果セットハンドルとして認識しないため、PostgreSQLからの複数の結果セットをサポートしていない可能性があります。 PostgreSQLは実際には複数の結果セットもサポートしておらず、リフレクターでエミュレートされているだけなので、これは十分に公平です。
あなたはFETCH
することができます refcursor
から SQLレベルのカーソルコマンド
FETCH ALL FROM "<unnamed portal 1>";
重要な二重引用符に注意してください。関数から返されたリフレクター名を<unnamed portal 1>
に置き換えます 。
また、カーソルがWITH HOLD
で作成されていない限り、リフレクターを作成したトランザクションは開いたままである必要があることにも注意してください。 。 HOLD
以外 トランザクションがコミットまたはロールバックすると、カーソルは閉じます。
たとえば、ダミーのrefcursor-returning関数があるとします。
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=#