首页 > 解决方案 > 如何将 RETURN SETOF RECORD 与动态列一起使用?

问题描述

我在获取查询值时遇到了一些问题。我需要根据查询返回动态列。对于这种情况,我不能使用 RETURN TABLE 语句,因为我们必须定义列。请帮忙 :)。谢谢

CREATE OR REPLACE FUNCTION public.FN_test(P_Company varchar, P_fiscal_periode varchar, P_opt int)
  RETURNS SETOF RECORD
AS $BODY$
DECLARE 
Details RECORD;

BEGIN
    create table Details as
    select * from M_Account;

    RETURN QUERY select * from Details;
    drop table Details;

END;
$BODY$
  LANGUAGE plpgsql 

这是结果错误

select FN_test('1000', '201808', 4)
> ERROR:  set-valued function called in context that cannot accept a set
  CONTEXT:  PL/pgSQL function fn_test(character varying,character varying,integer) line 9 at RETURN QUERY

标签: postgresql

解决方案


如果您返回记录类型,则必须定义列表中的列以从这些函数返回(当您调用它时)并使用以下格式调用函数:

select * from FN_test('1000', '201808', 4) 
as (f1 data type, f2 data type) --list of columns

也可以返回一个 JSON 类型(作为通用结果)然后处理它:

CREATE OR REPLACE FUNCTION public.FN_test3(P_Company varchar, P_fiscal_periode varchar, P_opt int)
 RETURNS setof json
 AS $BODY$
 DECLARE 
  Details RECORD;

 BEGIN
     create table Details as
     select row_to_json(M_Account.*) from M_Account; --JSON function

     RETURN QUERY select * from Details;
     drop table Details;

END;
$BODY$
LANGUAGE plpgsql 

并称之为:

select  * from FN_test('1000', '201808', 4) 

推荐阅读