node-postgres是否支持多个结果集?[英] does node-postgres support multiple resultsets

本文是小编为大家收集整理的关于node-postgres是否支持多个结果集?的处理方法,想解了node-postgres是否支持多个结果集?的问题怎么解决?node-postgres是否支持多个结果集?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我有一个返回多个结果集的 PostgresQL 函数.我可以毫无问题地在 .net 中提取这些结果集(所以我知道我的函数可以正常工作),但是我在使用 node-postgres 时遇到了麻烦.

结果对象返回一个包含 7 个项目的数组,该数组与返回的数据集的数量相匹配.

在 Node 中,7 行中的每一行都只包含一个 <unnamed portal 1> 字符串.

connection.query("BEGIN");
connection.query({text: "SELECT getoperationaldatasetmodel($1)", values : [clientid]}, function(err, results) {


  if (err) {
    connection.query("COMMIT");
    self.pool.release(connection);
    callback(err);
  }
  else {
    var opsDataset = null;
    var rows = results.rows;
    // this returns 7 rows but the rows do not contain data but rather the name of the dataset.
  }

那么:node-postgres 是否支持多个结果集,如果支持,有什么关于如何提取的建议吗?

编辑:这是我与 node-postgres 一起使用的代码,如果其他人将来需要使用它.

// must wrap in a transaction otherwise won't be able to see the multiple sets.
connection.query("BEGIN");
connection.query({text: "SELECT myfunction($1)", values : [clientid]}, function(err, results) {

  if (err) {

     // handle error here
     connection.query("COMMIT;");
  }
  else {

    connection.query('FETCH ALL FROM "<unnamed portal 1>"',  function(err, r1) {
        // r1.rows will contain the data for the first refcursor
    });
    connection.query('FETCH ALL FROM "<unnamed portal 2>"',  function(err, r2) {
        // r2.rows will contain the data for the second refcursor
    });

    // remember to handle the closure of the transaction

});

推荐答案

更新:见 这个优秀的教程解释了如何获取和管理引用.

<小时>

由于 node-postgres 无法识别您作为结果集句柄返回的 refcursor,它似乎不支持来自 PostgreSQL 的多个结果集.这很公平,因为 PostgreSQL 也不真正支持多个结果集,它们只是用 refcursors 进行模拟.

您可以通过 SQL 级游标命令从 refcursor FETCH SQL 级光标命令,尽管它的文档很糟糕.你不需要使用 PL/PgSQL 游标处理来做到这一点.只是:

FETCH ALL FROM "<unnamed portal 1>";

注意双引号,这很重要.用你的函数返回的 refcursor 名称替换 <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=# 

本文地址:https://www.itbaoku.cn/post/1763899.html