PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

o node-postgres suporta vários conjuntos de resultados


ATUALIZAÇÃO :Veja este excelente tutorial para uma explicação de como buscar e gerenciar refcursors.

Como o node-postgres não está reconhecendo os refcursors que você está retornando como identificadores do conjunto de resultados, parece provável que ele não suporte vários conjuntos de resultados do PostgreSQL. Isso é justo, pois o PostgreSQL também não suporta vários conjuntos de resultados, eles são apenas emulados com refcursors.

Você pode FETCH de um refcursor por meio de comandos de cursor em nível SQL comandos de cursor em nível SQL , embora a documentação seja miserável. Você não precisa usar PL/PgSQL manipulação do cursor para fazê-lo. Apenas:
FETCH ALL FROM "<unnamed portal 1>";

Observe as aspas duplas, que são importantes. Substitua o nome do refcursor retornado de sua função para <unnamed portal 1> .

Observe também que a transação que criou o refcursor ainda deve estar aberta, a menos que o cursor tenha sido criado WITH HOLD . Não HOLD os cursores são fechados quando a transação é confirmada ou revertida.

Por exemplo, dada a função de retorno de refcursor fictícia:
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 retorna um conjunto de cursores, você pode obter os resultados passando os nomes do portal para FETCH , por exemplo:
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=#