SQL函数return-type:TABLE vs SETOF记录

时间:2014-03-15 12:43:48

标签: sql postgresql return-type sql-function sql-types

返回TABLESETOF 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

2 个答案:

答案 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“未知记录”,是一个已定义的记录。

在此示例中,类型tablesetof是等效的,

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 。