5

複数の結果セットを返すPostgresQL関数があります。これらの結果セットを.netで問題なく抽出できますが(関数が正しく機能することがわかります)、node-postgresで抽出するのに問題があります。

結果オブジェクトは、返されたデータセットの数と一致する7つのアイテムの配列を返します。

ノードでは、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

});
4

1 に答える 1

5

更新:リフレクターをフェッチして管理する方法の説明については、この優れたチュートリアルを参照してください。


node-postgresは、返されるリフレクターを結果セットハンドルとして認識しないため、PostgreSQLからの複数の結果セットをサポートしていない可能性があります。PostgreSQLは実際には複数の結果セットもサポートしておらず、それらはrefcursorsでエミュレートされているだけなので、これは十分に公平です。

FETCHSQLレベルのカーソルコマンドをrefcursor介してSQLレベルのカーソルコマンドを実行できますが、そのドキュメントは悲惨です。PL/PgSQLカーソル処理を使用する必要はありません。ただ:

FETCH ALL FROM "<unnamed portal 1>";

重要な二重引用符に注意してください。関数から返されたrefcursor名を。に置き換えます<unnamed portal 1>

カーソルが作成されていない限り、refcursorを作成したトランザクションはまだ開いている必要があることにも注意してください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=# 
于 2012-08-24T01:05:31.777 に答える