Подтвердить что ты не робот

Возврат вставленных строк в PostgreSQL

В настоящее время я работаю над сервлетом генерации отчетов, который агломерирует информацию из нескольких таблиц и создает отчет. В дополнение к возврату результирующих строк я также храню их в таблице отчетов, поэтому позже их не нужно будет восстанавливать, и они будут сохраняться, если таблицы, из которых они сделаны, были стерты. Для этого у меня есть оператор формы (NB: 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

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

4b9b3361

Ответ 1

В 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

Ответ 2

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

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

Ответ 3

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

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

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