返回TABLE
与SETOF records
的函数之间的区别是什么,其他条件相同。
CREATE FUNCTION events_by_type_1(text) RETURNS TABLE(id bigint, name text) AS $$
SELECT id, name FROM events WHERE type = $1;
$$ LANGUAGE SQL STABLE;
CREATE FUNCTION events_by_type_2(text) RETURNS SETOF record AS $$
SELECT id, name FROM events WHERE type = $1;
$$ LANGUAGE SQL STABLE;
这些函数似乎返回相同的结果。请参阅此SQLFiddle。
答案 0 :(得分:17)
返回SET OF record
时,输出列未输入且未命名。因此,这个表单不能直接在FROM子句中使用,就像它是子查询或表一样。
即发布时:
SELECT * from events_by_type_2('social');
我们收到此错误:
错误:返回函数需要列定义列表 "记录"
它可以"铸造"但是,SQL调用者可以使用正确的列类型。这个表格确实有效:
SELECT * from events_by_type_2('social') as (id bigint, name text);
并导致:
id | name ----+---------------- 1 | Dance Party 2 | Happy Hour ...
因此SET OF record
被认为不太实际。只有在事先不知道结果的列类型时才应该使用它。
答案 1 :(得分:7)
这个答案只是为了记住 TABLE 和 SETOF 等同的上下文。
正如@a_horse_with_no_name指出的那样,它不是 RETURNS SETOF“未知记录”,是一个已定义的记录。
在此示例中,类型table
和setof
是等效的,
CREATE TYPE footype AS (score int, term text);
CREATE FUNCTION foo() RETURNS SETOF footype AS $$
SELECT * FROM ( VALUES (1,'hello!'), (2,'Bye') ) t;
$$ language SQL immutable;
CREATE FUNCTION foo_tab() RETURNS TABLE (score int, term text) AS $$
SELECT * FROM ( VALUES (1,'hello!'), (2,'Bye') ) t;
$$ language SQL immutable;
SELECT * FROM foo(); -- works fine!
SELECT * FROM foo_tab(); -- works fine and is equivalent.
RETURNS SETOF 具有优势的重用类型(参见 footype ),这对于 RETURNS TABLE 。