我是PostgreSQL的新手(使用v9.0),想知道是否可以在同一个函数中使用return next
和Return query
,而无需在将结果附加到结果集中之前退出函数?
CREATE TYPE return_type AS
(paramname character varying,
value character varying);
CREATE OR REPLACE FUNCTION myfuntion(param1 character varying)
RETURNS SETOF return_type AS
declare
r return_type;
message varchar;
status integer;
$BODY$
BEGIN
o_call_status := 0;
o_call_message := '';
Return query Select 'mystatus' as paramName, status::varchar as value;
Return query Select 'mymessage' as paramName, message as value;
for r in SELECT 'mycolumnname1' as paramName,mycolumn1 as value FROM tb1
WHERE column1 = val
UNION ALL
SELECT 'mycolumnname2' as paramName,mycolumn2 as value FROM tb1
WHERE column1 = val
UNION ALL
SELECT 'mycolumnname3' as paramName,mycolumn3 as value FROM tb2
WHERE column1 = val1 AND
column4 = val4 loop
return next r;
end loop;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
2条答案
按热度按时间xmq68pz91#
从PL/pgSQL函数返回
您可以自由重复地混合
RETURN NEXT
和RETURN QUERY
。基本原理是PL/pgSQL在本地构建表,直到函数完成才返回:手册:
注意:
RETURN NEXT
和RETURN QUERY
的当前实现在从函数返回之前存储整个结果集,…如果您对目前为止的结果不满意,并且客户端看不到任何东西,则可以引发异常来中止操作。我们还在手册中包含了一个示例来演示这一点,就在上面所说的引用。
交叉表
至于您尝试实现的功能,请考虑
tablefunc
扩展中的crosstab()
函数。参见:zzlelutf2#
我不确定你是否能把这两个混合在一起(试试看……)。
也就是说,在你的用例中,使用union all子句编写一个查询,直接返回所有行会更有效:
你可能也会发现这个contrib模块很有帮助,顺便说一句:
http://www.postgresql.org/docs/current/static/tablefunc.html
如果可能的话,重新审视你的模式或你使用它的方式,这样你就不需要这种函数来开始了--返回可能很大的集合的集合返回函数可能特别低效。在您的情况下,似乎您需要三列。为什么不简单的使用?