我在接受源表作为传入变量的 plpgsql 函数中动态构建查询。我想返回构建的 SELECT
语句的结果,该语句对给定表执行聚合,并返回该表的结果。
但是,目前我收到以下错误:
********** Error **********
ERROR: a column definition list is required for functions returning "record" SQL state: 42601
看来我需要定义要返回的记录行的列类型。
I found this answer您可以通过提供结果行将匹配的表来绕过表类型声明。
RETURNS SETOF some_existing_table
但是,在我的例子中,由于我要匹配其列类型的表被传递给函数,所以我不知道该表,直到我可以操作传递的变量(在 DECLARE
/开始
)。
理想情况下,我想返回我在函数内构建的聚合查询的查询结果(多行)。有没有办法根据函数内的已知表动态定义结果行返回类型?
最佳答案
Is there a way to define result row return types based on a known table dynamically within the function?
如果“基于已知表”是指“完全像已知表”,那么是。
SQL 是一种严格类型化的语言,必须使用明确定义的返回类型创建函数。您可以像显然那样回退到匿名记录(使用RETURNS SETOF record
),但是您需要为每次调用添加列定义列表,例如错误消息告诉你。像这样的东西:
SELECT *
FROM my_function('foo') AS foo (
colum_name1 integer -- name and data type for every column
, colum_name2 text
, colum_name3 real);
这几乎不是动态的。
您的问题留有解释的余地,但是“基于已知表” 表示多态函数 可能会解决问题。返回类型可以动态地基于任何注册的行类型,系统中的每个表自动有一个。准系统代码示例:
CREATE OR REPLACE FUNCTION my_function(_rowtype anyelement)
RETURNS SETOF anyelement AS
$func$
BEGIN
RETURN QUERY EXECUTE format(
'SELECT * FROM %s LIMIT 10'
, pg_typeof(_rowtype) -- pg_typeof() returns regtype, quoted where necessary
);
END
$func$ LANGUAGE plpgsql;
调用:
SELECT * FROM my_function(NULL::my_table);
这个相关答案中的详细说明(看最后一章“各种完整的表格类型”):
关于postgresql - 根据 plpgsql 中传递的给定表动态定义返回行类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36668165/