我正在尝试按照以下方式定义一个函数:
CREATE FUNCTION myfunction(list_of_ids integer[]) RETURNS record AS $$
SELECT a.col1, b.col2 FROM a, b WHERE col1 = ANY($1);
$$ LANGUAGE 'sql'
然而,postgres似乎不满意“记录”作为返回类型,当我尝试执行该函数时给我这个错误:
ERROR: a column definition list is required for functions returning "record"
查看文档虽然我无法弄清楚如何提供此列定义列表。
答案 0 :(得分:2)
首先,您的查询似乎已关闭:表a
和b
没有加入条件?你不想要笛卡尔积,是吗?尝试类似:
SELECT a.col1, b.col2
FROM a
JOIN b ON <some condition like b.a_id = a.a_id>
WHERE col1 = ANY($1);
接下来,为函数使用返回类型,这样您就不必为每个调用提供列定义列表。在示例中,我使用了RETURNS TABLE
。阅读more ways in the manual。
可能看起来像这样:
CREATE FUNCTION myfunction(list_of_ids integer[])
RETURNS TABLE (
col1 text -- has to match the type of the column a.col1 that is returned.
,col2 text -- match type of a.col2
) AS
$$
SELECT a.col1, b.col2
FROM a
JOIN b ON <some condition like b.a_id = a.a_id>
WHERE col1 = ANY($1);
$$
LANGUAGE sql;
'sql'周围的单引号只是噪音。它可以作为一个关键词。
现在你可以致电:
SELECT * FROM myfunction('{11,23,6}'::integer[]);
答案 1 :(得分:0)
我最终使用了一个准备好的查询 - 我真正想要的是确保每次解析查询和生成查询计划的开销都被消除了,所以准备好的语句对此工作正常。