Function Postgres创建具有记录类型功能的视图

Function Postgres创建具有记录类型功能的视图,function,postgresql,record,plpgsql,Function,Postgresql,Record,Plpgsql,我有一个复杂的查询,用户定义的函数conta\u relatos()和select语句运行得很好。但是,当我尝试使用相同的指令创建视图时,它不起作用。Postgres告诉我“conta_relatos”列有伪类型记录。此函数,conta\u relatos()返回记录类型变量。 编辑添加: 返回类型是前面问题中定义的一种众所周知的复合类型: 以下是查询: CREATE OR REPLACE VIEW "Sumario" AS SELECT "Aspectos"."ID" AS "Aspect

我有一个复杂的查询,用户定义的函数
conta\u relatos()
和select语句运行得很好。但是,当我尝试使用相同的指令创建视图时,它不起作用。Postgres告诉我“conta_relatos”列有伪类型记录。此函数,
conta\u relatos()
返回记录类型变量。
编辑添加:
返回类型是前面问题中定义的一种众所周知的复合类型:

以下是查询:

CREATE OR REPLACE VIEW "Sumario" AS 
SELECT "Aspectos"."ID" AS "Aspecto Normativo ID", 
    "Aspectos"."Aspecto" AS "Aspecto Normativo", 
    "Fatores"."ID" AS "Fator Normativo ID", 
    "Fatores"."Fator" AS "Fator Normativo", "Diagnostico"."Vinculo_Final", 
    "Fatores_1"."ID" AS "Fator Determinativo ID", 
    "Fatores_1"."Fator" AS "Fator Determinativo", 
    "Aspectos_1"."ID" AS "Aspecto Determinativo ID", 
    "Aspectos_1"."Aspecto" AS "Aspecto Determinativo", 
    count("Itens"."ID") AS "No Itens", 
    conta_relatos("Fatores"."ID", "Fatores_1"."ID")
FROM  
    "Diagnostico"
JOIN ("Aspectos" "Aspectos_1"
JOIN ("Fontes"
JOIN "Itens" ON "Fontes"."ID" = "Itens"."Fonte"
JOIN ("Fatores" "Fatores_1"
JOIN ("Aspectos"
JOIN ("Vinculos"
JOIN "Fatores" ON "Vinculos"."Fator_Normativo" = "Fatores"."ID") ON "Aspectos"."ID" = "Fatores"."Aspecto" AND "Aspectos"."ID" = "Fatores"."Aspecto") ON "Fatores_1"."ID" = "Vinculos"."Fator_Determinativo") ON "Itens"."ID" = "Vinculos"."Item") ON "Aspectos_1"."ID" = "Fatores_1"."Aspecto") ON "Diagnostico"."ID" = "Vinculos"."Diagnostico_ID"
GROUP BY "Aspectos"."ID", "Aspectos"."Aspecto", "Fatores"."ID", "Fatores"."Fator", "Diagnostico"."Vinculo_Final", "Fatores_1"."ID", "Fatores_1"."Fator", "Aspectos_1"."ID", "Aspectos_1"."Aspecto"
ORDER BY "Aspectos"."ID", "Aspectos_1"."ID", "Fatores"."Fator", "Fatores_1"."Fator";

仔细检查:您只需要像这样拆分复合退货类型:

CREATE OR REPLACE VIEW "Sumario" AS 
SELECT ...
 (conta_relatos("Fatores"."ID", "Fatores_1"."ID")).*
FROM ...
我引述:

如果函数已定义为返回记录数据类型, 然后必须显示别名或关键字AS,后跟一列 表单中的定义列表(列名称数据类型[,…])。这个 列定义列表必须与列的实际数量和类型匹配 函数返回的列


干净的解决方案是将函数更改为返回已知类型,而不是匿名记录。根据具体情况,有多种方法可以做到这一点。如果您在重写函数时遇到问题,请打开另一个问题。

仔细检查:您只需要像这样拆分复合返回类型:

CREATE OR REPLACE VIEW "Sumario" AS 
SELECT ...
 (conta_relatos("Fatores"."ID", "Fatores_1"."ID")).*
FROM ...
我引述:

如果函数已定义为返回记录数据类型, 然后必须显示别名或关键字AS,后跟一列 表单中的定义列表(列名称数据类型[,…])。这个 列定义列表必须与列的实际数量和类型匹配 函数返回的列


干净的解决方案是将函数更改为返回已知类型,而不是匿名记录。根据具体情况,有多种方法可以做到这一点。如果您在重写函数时遇到困难,请打开另一个问题。

再次感谢您,欧文,我将发布另一个问题,以便重写我的函数。@Britto:欢迎。记住在下一个问题中添加你的Postgres版本。@Britto:更新了我的答案。我一开始误解了错误信息。再次感谢你,欧文,我将发布另一个问题,以便重写我的函数。@Britto:欢迎。记住在下一个问题中添加你的Postgres版本。@Britto:更新了我的答案。起初我误解了错误信息。