返回TABLEvs的函数有什么区别SETOF records,其他所有条件相等。
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。
返回时SETOF record,输出列未键入且未命名。因此,这种形式不能像在子查询或表中一样直接在FROM子句中使用。
SETOF record
即,在发行时:
SELECT * from events_by_type_2('social');
我们得到这个错误:
错误:返回“记录”的函数需要列定义列表
但是,SQL调用者可以将其“广播”为正确的列类型。此表格可以正常工作:
SELECT * from events_by_type_2('social') as (id bigint, name text);
结果为:
id | 姓名 ---- + ---------------- 1 | 舞会 2 | 欢乐时光 ...
因此,SETOF record被认为不太实用。仅在事先不知道结果的列类型时才应使用它。