2010-02-16 3 views
11

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

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 

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

ответ

20

В 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 
+0

Мы бежим 8.4, так что идеально подходит, спасибо. – Dusty

+0

+1 для надежного ответа и (также) упоминания требований к версии (хотя большинство людей должно быть как минимум 8.3) – ChristopheD

4

Вы также можете использовать 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; 

documentation

+1

Я верю, что Op попросил вернуть целую строку, которая будет 'RETURNING *;' – BishopZ

Смежные вопросы