ACTUALIZAR :Vea este excelente tutorial para obtener una explicación de cómo obtener y administrar los cursores de referencia.
Dado que node-postgres no reconoce los cursores de referencia que está devolviendo como identificadores de conjuntos de resultados, parece probable que no admita múltiples conjuntos de resultados de PostgreSQL. Eso es lo suficientemente justo ya que PostgreSQL tampoco admite múltiples conjuntos de resultados, solo se emulan con refcursores.
Puedes FETCH
desde un refcursor
a través de comandos de cursor de nivel SQL Comandos de cursor de nivel SQL
, aunque la documentación para ello es miserable. No necesita usar PL/PgSQL
manejo del cursor para hacerlo. Solo:
FETCH ALL FROM "<unnamed portal 1>";
Tenga en cuenta las comillas dobles, que son importantes. Sustituya el nombre del cursor de referencia devuelto por su función por <unnamed portal 1>
.
Tenga en cuenta también que la transacción que creó el cursor de referencia aún debe estar abierta a menos que el cursor se haya creado WITH HOLD
. No HOLD
los cursores se cierran cuando la transacción se confirma o retrocede.
Por ejemplo, dada la función ficticia de retorno de cursor de referencia:
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';
... que devuelve un conjunto de cursores, puede obtener los resultados pasando los nombres del portal a FETCH
, por ejemplo:
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=#