如何在动态列中使用RETURN SETOF RECORD?

时间:2019-08-31 10:57:09

标签: postgresql

我在获取查询值方面遇到一些问题。我需要根据查询获得带有动态列的返回。对于这种情况,我不能使用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

1 个答案:

答案 0 :(得分:0)

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

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

还可以返回JSON类型(作为通用resuldt),然后对其进行处理:

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)