Intereting Posts
Проблема с одновременным выполнением операций чтения и записи одним документом в mongodb / node.js простой запрос ajax на сервер localhost nodejs nodejs – mongodb native найти все документы Подключение к localhost: 3000 с другого компьютера | expressjs, nodejs какая разница между импортом и константой, а какая предпочтительнее в общем Почему мне не удалось подключиться к websocket? Два приложения в expressjs Nodejs: Как обрабатывать прослушивание событий между объектами? Угловой порт 4200, показывающий данные с html, но nodejs порт 8080, показывающий данные json без html Node.js C ++ addon: несколько обратных вызовов из разных streamов Node.js – события js 72 throw er unhandled ‘error’ event Не удается выполнить приложение Node.js на Heroku (сбой каждый раз) Функции FireBase .once (‘value’), возвращающие неопределенные Проблемы с синтаксисом запроса Node.js mysql UPDATE WHERE Mongoose: Пользовательское сообщение об ошибке для проверки типа даты?

Узел-postgres поддерживает несколько наборов результатов

У меня есть функция PostgresQL, которая возвращает несколько наборов результатов. Я могу извлечь эти результаты в .net без проблем (так что я знаю, что моя функция работает правильно), но у меня возникают проблемы с node-postgres.

Объект result возвращает массив из 7 элементов, который соответствует количеству возвращаемых наборов данных.

В узле каждый из 7 строк просто содержит строку .

 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. } 

Итак: поддерживает ли узел-postgres несколько наборов результатов и, если да, какие-либо предложения по извлечению?

EDIT: Вот код, который я использовал с 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 ""', function(err, r1) { // r1.rows will contain the data for the first refcursor }); connection.query('FETCH ALL FROM ""', function(err, r2) { // r2.rows will contain the data for the second refcursor }); // remember to handle the closure of the transaction }); 

ОБНОВЛЕНИЕ : см. Этот отличный учебник для объяснения того, как извлекать и управлять рекурсорами.


Поскольку node-postgres не распознает refcursors, которые вы возвращаете в качестве обработчиков результатов, представляется вероятным, что он не поддерживает несколько наборов результатов из PostgreSQL. Это справедливо, поскольку PostgreSQL на самом деле не поддерживает множество наборов результатов, они просто эмулируются с помощью refcursors.

Вы можете FETCH из refcursor помощью команд курсора на SQL-уровне командами курсора на уровне SQL , хотя документация для него является жалкой. Для этого вам не нужно использовать обработку курсора PL / PgSQL . Просто:

 FETCH ALL FROM ""; 

Обратите внимание на двойные кавычки, которые важны. Подставьте имя refcursor, возвращаемое из вашей функции, для .

Также обратите внимание, что транзакция, которая создала refcursor, должна быть открыта, если курсор не был создан WITH HOLD . Курсоры не- HOLD закрываются, когда транзакция совершает или откатывается.

Например, с учетом функции возврата возвращаемого объекта:

 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 ---------------------------   (2 rows) regress=# FETCH ALL FROM ""; generate_series ----------------- 1 2 3 4 (4 rows) regress=# FETCH ALL FROM ""; generate_series ----------------- 5 6 7 8 (4 rows) regress=#