我正在plpgsql函数中动态构建一个查询,该函数接受一个源表作为传入变量 . 我想返回构建的 SELECT
语句的结果,该语句在给定的表上执行聚合,并返回该表的结果 .
但是,目前我收到以下错误:
******错误******错误:返回“record”SQL函数的函数需要列定义列表:42601
所以看起来我需要定义我想要返回的记录行的列类型 .
I found this answer您可以通过提供生成的行将匹配的表来绕过表类型声明 .
RETURNS SETOF some_existing_table
但是,在我的情况下,由于我要匹配的列类型的表被传递给函数,我不知道该表,直到我可以操作传递的变量(在 DECLARE
/ BEGIN
之后) .
理想情况下,我想返回我在函数中构建的聚合查询的查询结果(多行) . 有没有办法在函数内动态定义基于已知表的结果行返回类型?
1 回答
如果"based on a known table"表示"exactly like a known table",那么 yes .
SQL是一种严格类型的语言,必须使用定义良好的返回类型创建函数 . 您可以像显然那样(使用
RETURNS SETOF record
)回退到 anonymous records ,但是您需要为每个调用添加列定义列表,就像错误消息告诉您的那样 . 就像是:这很难动态 .
你的问题留下了解释的空间,但"based on a known table"表明 polymorphic function 可能会有所作为 . 返回类型可以动态地基于任何已注册的行类型,并且系统中的每个表都会自动生成一个 . 准系统代码示例:
呼叫:
本相关答案中的详细说明(请参阅最后一章"Various complete table types"):