首页 > 数据库技术 > 详细

postgresql PL/pgSQL return setof和TABLE的区别

时间:2021-08-30 09:41:45      阅读:13      评论:0      收藏:0      [点我收藏+]

在pg中,广泛的使用了表函数代替视图,返回集合有两种定义,setof和table。他们的区别在于table明确定义了字段名和类型,如下:

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;

而setof则依赖SQL编译器解析,如下:

CREATE FUNCTION events_by_type_2(text) RETURNS SETOF record AS $$
    SELECT id, name FROM events WHERE type = $1;
$$ LANGUAGE SQL STABLE;

使用的时候要明确as一把,如下:

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

否则会提示"ERROR: a column definition list is required for functions returning "record""。

另外一种方式是不要返回record而是具体的类型,例如:

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;

SELECT * FROM foo();  

在pg 10+新版本中,本质上没有区别。return setof my_type会更合适一些,它鼓励重用类型、而不是随意的拼接。

https://stackoverflow.com/questions/22423958/sql-function-return-type-table-vs-setof-records

postgresql PL/pgSQL return setof和TABLE的区别

原文:https://www.cnblogs.com/zhjh256/p/14985294.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!