Возврат вставленных строк в PostgreSQL - PullRequest
15 голосов
/ 17 февраля 2010

В настоящее время я работаю над сервлетом генерации отчетов, который объединяет информацию из нескольких таблиц и генерирует отчет. В дополнение к возвращению полученных строк я также сохраняю их в таблицу отчетов, чтобы их не нужно было перегенерировать позже, и будет сохраняться, если таблицы, из которых они взяты, стерты. Для этого у меня есть утверждение вида (примечание: x генерируется извне и фактически является константой в этом утверждении):

INSERT INTO reports
   (report_id, col_a, col_b, col_c)
SELECT x as report_id, foo.a, bar.b, bar.c
FROM foo, bar

Это работает нормально, но затем мне нужен второй запрос, чтобы на самом деле вернуть результирующие строки, например,

SELECT col_a, col_b, col_c
FROM reports
WHERE report_id = x

Это прекрасно работает, и поскольку оно включает только одну таблицу, не должно быть дорогим, но, похоже, я должен иметь возможность напрямую возвращать результаты вставки, избегая второго запроса. Есть ли какой-то синтаксис для этого, который я не смог найти? (Должен заметить, я довольно новичок в работе с БД, поэтому, если правильный ответ - просто запустить второй запрос, так как он немного медленнее, так и будет)

Ответы [ 3 ]

25 голосов
/ 17 февраля 2010

В PostgreSQL с версией> = 8.2 вы можете использовать эту конструкцию:

INSERT INTO reports (report_id, col_a, col_b, col_c)
SELECT x as report_id, foo.a, bar.b, bar.c
FROM foo, bar
RETURNING col_a, col_b, col_c
9 голосов
/ 21 октября 2016

Или без выбора:

INSERT INTO distributors (did, dname) VALUES (DEFAULT, 'XYZ Widgets')
   RETURNING did;

Документация

4 голосов
/ 17 февраля 2010

Вы также можете использовать SRF, хотя это может быть излишним. Это зависит от того, что вы пытаетесь сделать. Например, если вы только возвращаете информацию для выполнения части логики, которая будет напрямую возвращаться в базу данных для выполнения большего количества запросов, может иметь смысл использовать SRF.

http://wiki.postgresql.org/wiki/Return_more_than_one_row_of_data_from_PL/pgSQL_functions

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...