postgresql - 如何将 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
解决方案
如果您返回记录类型,则必须定义列表中的列以从这些函数返回(当您调用它时)并使用以下格式调用函数:
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)
推荐阅读
- c# - C# 尽可能高效地从字符串中删除回车符、换行符和空格(基准)
- masstransit - DelegateEndpointDefinition IsTemporary
- javascript - Snackbar 未在页面中呈现
- reactjs - Material-Table里面的开关打不开
- ant - Jacoco 覆盖在 java 类中为 org/apache/log4j/Category 提供错误
- java - JPA 与共享主键的单向@OneToOne 关系始终触发辅助查询,即使 fetchType 为 EAGER
- flutter - 如何使用 bloc flutter 更改单个列表项的状态?
- python - TensorFlow 导入错误
- javascript - 如何将嵌套的对象数组展平为数组数组?
- django - 当我进行编辑时,Django 静态文件不会改变我的网站