第一种选择:声明setof 某表/某视图 返回类型 这是postgresql官方推荐的返回结果集的形式,当你查阅postgresql官方文档的时候,你会看到的就是这种形式。如果采用这种形式,你的function代码看起来会像这样:CREATE OR REPLACE FUNCTION function1 () RETURNS setof table1 AS $body$ DECLARE result record; BEGIN for result in select * from table1 loop return next result; end loop; return; END; $body$ LANGUAGE ‘plpgsql‘ VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
这是使用pl/pgsql语言的风格,你甚至可以使用sql语言让代码看起来更简单:
CREATE OR REPLACE FUNCTION function1 () RETURNS SETOF table1 AS $body$ SELECT * from table1; $body$ LANGUAGE ‘sql‘ VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
以下是分析: 首先我们说优点,第一、这是官方推荐的;第二、当使用pl/pgsql语言的时候,我们可以在循环中加上判断语句,仅返回我们需要的行;第三、在jdbc调用中,我们可以像查询普通的表一样使用这个function,例如:"select * from function1()"。 其次我们说缺点,第一、当使用pl/pgsql语言的时候,即使我们需要返回所有行,仍然要进行循环导致不必要的开销。当然你可以使用sql语言避免这个问题,但显然sql语言的控制能力太弱以至于我们无法使用它实现哪怕稍微复杂一点的逻辑。第二、返回的字段必须是在function定义时就确定了的,这意味着我们无法动态的返回我们想要返回的字段。
第三种选择:声明refcursor返回类型 事情到这里将揭过新的一页,这里我们放弃使用setof ××× ,而使用一个全新的返回类型——refcursor(游标)。关于什么是游标本文不再累述,请自己翻阅相关文档,这里仅描述如何使用。 首先,要使用游标,你的function编码看起来会像这样: CREATE OR REPLACE FUNCTION function1 () RETURNS refcursor AS $body$ DECLARE result refcursor; BEGIN open result for select * from table1,table2; --你可以任意选择你想要返回的表和字段 return result; END; $body$ LANGUAGE ‘plpgsql‘ VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;