在PostgreSQL中返回插入的行

时间:2010-02-16 21:42:31

标签: postgresql

我目前正在开发一个报告生成servlet,它可以聚合来自多个表的信息并生成报告。除了返回结果行之外,我还将它们存储到报告表中,以便以后不需要重新生成它们,并且如果从中抽取它们的表将被擦除,它们将保持不变。为了做后者,我有一个表单声明(注意: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 个答案:

答案 0 :(得分:24)

在版本为> = 8.2的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
RETURNING col_a, col_b, col_c

答案 1 :(得分:8)

或者没有选择:

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

documentation

答案 2 :(得分:4)

你也可以使用SRF,虽然这可能有点过分。这取决于你想要做什么。例如,如果您只返回信息以执行将直接返回数据库以执行更多查询的逻辑,则使用SRF可能是有意义的。

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