我想创建一个函数,它返回一个表的一行,但是可以与其他表联系起来的一些其他列。我怎样才能做到这一点?我应该申报一个新类型吗?或者我应该返回表格类型吗?
答案 0 :(得分:2)
使用RETURNS TABLE
并枚举原始表格的所有列以及所有新列。
请参阅the manual。
或者,您可以返回表格类型加上额外列,因此您可以生成复合类型字段,例如
RETURNS TABLE (tablerow table_type, extracol1 integer, extracol2 text)
答案 1 :(得分:1)
您无法返回表格的复合类型的值,因为这样您就无法添加其他列。
你可以:
声明包含要返回的列的新复合类型,或
返回一个没有任何固定结构的RECORD类型。在那种情况下,您将返回查询的结果行,该行提取连接到其他表的表行。
根据您提供的少量信息,记录最简单。
请参阅:
更新:使用记录类型进行测试后,使用起来有点不方便。考虑这个例子:
CREATE TABLE a(id SERIAL PRIMARY KEY, foo TEXT, bar INT);
CREATE TABLE b(id SERIAL PRIMARY KEY, aid INT, baz TEXT);
INSERT INTO a(foo,bar) VALUES('apples', 25);
INSERT INTO b(aid, baz) VALUES(1, 'bananas');
CREATE OR REPLACE FUNCTION TEST(p_id INT) RETURNS SETOF RECORD AS $$
BEGIN
RETURN QUERY SELECT a.id,foo,bar,baz FROM a LEFT JOIN b ON a.id=b.aid WHERE A.ID=p_id;
END;
$$ LANGUAGE plpgsql;
如果你天真地试图像这样使用它:
psql=> SELECT * FROM TEST(1);
ERROR: a column definition list is required for functions returning "record"
LINE 1: SELECT * FROM TEST(1);
^
实际上,每次要调用它时,都必须指定一个列定义列表,如下所示:
psql=> SELECT * FROM TEST(1) AS test(id int, foo text, bar int, baz text);
id | foo | bar | baz
----+--------+-----+---------
1 | apples | 25 | bananas
(1 row)
因此,如果这是您的预期用例,那么我建议您遵循Craig概述的方法。