【问题标题】:Postgres Create View With Record Type FunctionPostgres 使用记录类型函数创建视图
【发布时间】:2013-02-23 01:30:38
【问题描述】:

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

下面是查询:

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";

【问题讨论】:

    标签: function postgresql record plpgsql


    【解决方案1】:

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

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

    Details about accessing composite types in the manual.

    顺便说一句:我建议不要在 JOIN 中使用括号,除非您确切知道自己在做什么。您拥有它的方式是强制执行一个特定的执行计划。很有可能,它不是最好的。


    第一种方法误解了错误信息

    当您使用RETURNS record 定义函数时(我尽可能避免),您必须在每次调用时提供列定义列表,例如:

    SELECT * FROM conta_relatos(1,2) AS f(col1 int, col2 text, ...)
    

    我引用the manual here

    如果函数已定义为返回记录数据类型, 然后必须存在别名或关键字 AS,后跟一列 格式为 ( column_name data_type [, ... ] ) 的定义列表。这 列定义列表必须与实际数量和类型相匹配 函数返回的列。

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

    【讨论】:

    • 再次感谢 Erwin,我将发布另一个问题,以便我可以重写我的函数。
    • @Britto:欢迎。请记住在下一个问题中添加您的 Postgres 版本。
    • @Britto:更新了我的答案。一开始我误解了错误信息。
    猜你喜欢
    • 1970-01-01
    • 2022-01-15
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多