postgresql 在同一个Postgres函数中使用return next和return query

xlpyo6sf  于 2023-05-06  发布在  PostgreSQL
关注(0)|答案(2)|浏览(391)

我是PostgreSQL的新手(使用v9.0),想知道是否可以在同一个函数中使用return nextReturn 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
xmq68pz9

xmq68pz91#

从PL/pgSQL函数返回

您可以自由重复地混合RETURN NEXTRETURN QUERY。基本原理是PL/pgSQL在本地构建表,直到函数完成才返回:
手册:
注意:RETURN NEXTRETURN QUERY的当前实现在从函数返回之前存储整个结果集,…
如果您对目前为止的结果不满意,并且客户端看不到任何东西,则可以引发异常来中止操作。我们还在手册中包含了一个示例来演示这一点,就在上面所说的引用。

交叉表

至于您尝试实现的功能,请考虑tablefunc扩展中的crosstab()函数。参见:

  • PostgreSQL交叉表查询
zzlelutf

zzlelutf2#

我不确定你是否能把这两个混合在一起(试试看……)。
也就是说,在你的用例中,使用union all子句编写一个查询,直接返回所有行会更有效:

return query
select 'mystatus' as paramName, status::varchar as value
union all
select 'mymessage' as paramName, message as value
union all
SELECT 'mycolumnname1' as paramName,mycolumn1 as value
FROM tb1
WHERE column1 = val
union all
…

你可能也会发现这个contrib模块很有帮助,顺便说一句:
http://www.postgresql.org/docs/current/static/tablefunc.html
如果可能的话,重新审视你的模式或你使用它的方式,这样你就不需要这种函数来开始了--返回可能很大的集合的集合返回函数可能特别低效。在您的情况下,似乎您需要三列。为什么不简单的使用?

select col1, col2, col3 from tbl

相关问题