使用参数从set return函数插入表

时间:2012-05-28 06:28:16

标签: sql postgresql compositetype

这可能很简单,但无法弄清楚。

我的表摘要和函数GetSummary将行作为摘要集返回。我可以这样查询

SELECT GetSummary(arg1, arg2)
GetSummary
-----------
(val1, val2, val3)

就像这样返回实际的列:

SELECT * FROM GetSummary(arg1, arg2)
col1  |   col2   | col3
------------------------
val1  |   val2   | val3

插入摘要工作正常:

INSERT INTO Summary (SELECT * FROM GetSummary(arg1, arg2));
INSERT 0 1

但我无法弄清楚如何根据其他表中的列一次插入多行。我想做这样的事情:

INSERT INTO Summary (SELECT FROM GetSummary(OtherTable.x, OtherTable.y)
FROM OtherTable WHERE <some query>);

失败,因为SELECT FROM GetSummary ..没有返回摘要表行。查询SELECT * FROM GetSummary ..会这样做,但后来我不知道如何编写查询。

修改

发布后几分钟发生了绊倒解决方案。正确的语法是

INSERT INTO Summary (SELECT (GetSummary(OtherTable.x, OtherTable.y)).*
FROM OtherTable WHERE <some query>);

(X)。*表示法将select扩展为列。

1 个答案:

答案 0 :(得分:2)

附加到问题的解决方案仍然存在语法错误。它应该是:

INSERT INTO Summary
SELECT (GetSummary(o.x, o.y)).*
FROM   OtherTable o
WHERE  <some condition>;

必须:
- 只有一个FROM

可选:
- 所需的SELECT周围没有括号 - 表别名以简化语法。

Accessing Composite Types上的手册。


此外,您的函数似乎应该返回一个(或否)行。 如果是这种情况,您应该在SETOF子句中删除 RETURNS 。那个:

CREATE FUNCTION getsummary( ... )
   RETURNS summary AS ...