gpt4 book ai didi

postgresql - 根据 plpgsql 中传递的给定表动态定义返回行类型?

转载 作者:行者123 更新时间:2023-11-29 12:58:28 24 4
gpt4 key购买 nike

我在接受源表作为传入变量的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com