SQL function return-type: TABLE vs SETOF records

后端 未结 2 2009
清酒与你
清酒与你 2020-12-16 10:35

What\'s the difference between a function that returns TABLE vs SETOF records, all else equal.

CREATE FUNCTION events_by_type_1(tex         


        
相关标签:
2条回答
  • 2020-12-16 10:54

    This answer is only to remember alternative context where TABLE and SETOF are equivalent.

    As @a_horse_with_no_name pointed, it is not a RETURNS SETOF "unknown record", is a defined one.


    In this example, the types table and setof are equivalent,

    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.
    

    The RETURNS SETOF have the advantage of reuse type (see footype), that is impossible with RETURNS TABLE.

    0 讨论(0)
  • 2020-12-16 11:06

    When returning SETOF record the output columns are not typed and not named. Thus this form can't be used directly in a FROM clause as if it was a subquery or a table.

    That is, when issuing:

    SELECT * from events_by_type_2('social');
    

    we get this error:

    ERROR: a column definition list is required for functions returning "record"

    It can be "casted" into the correct column types by the SQL caller though. This form does work:

    SELECT * from events_by_type_2('social') as (id bigint, name text);
    

    and results in:

     id |      name      
    ----+----------------
      1 | Dance Party
      2 | Happy Hour
     ...
    

    For this reason SETOF record is considered less practical. It should be used only when the column types of the results are not known in advance.

    0 讨论(0)
提交回复
热议问题