一尘不染

SQL函数返回类型:TABLE vs SETOF记录

sql

返回TABLEvs的函数有什么区别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


阅读 160

收藏
2021-03-10

共1个答案

一尘不染

返回时SETOF record,输出列未键入且未命名。因此,这种形式不能像在子查询或表中一样直接在FROM子句中使用。

即,在发行时:

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被认为不太实用。仅在事先不知道结果的列类型时才应使用它。

2021-03-10