1

conta_relatos()selectステートメントとして非常にうまく実行されているユーザー定義関数を使用したこの複雑なクエリがあります。しかし、同じ手順でビューを作成しようとすると機能しません。Postgresは、列「conta_relatos」に疑似タイプのレコードがあると言っています。この関数conta_relatos()は、レコード型変数を返します。
編集者による追加:
戻り型は、前の質問で定義されているよく知られた複合型です:
Postgres関数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";
4

1 に答える 1

1

詳細な検査について:次のように複合返品タイプを分割する必要があるだけです。

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

マニュアルの複合型へのアクセスに関する詳細。

余談ですが、自分が何をしているのかを正確に理解していない限り、JOINに括弧を使用しないことをお勧めします。あなたがそれを持っている方法で、あなたは1つの特定の実行計画を強制しています。たぶん、それは最高のものではありません。


最初のアプローチはエラーメッセージを誤って解釈しました

を使用して関数を定義する場合RETURNS record(可能な場合は避けます)、次のように、すべての呼び出しで列定義リストを提供する必要があります。

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

ここでマニュアルを引用します:

関数がレコードデータ型を返すように定義されている場合は、エイリアスまたはキーワードASが存在し、その後に(column_name data_type [、...])の形式の列定義リストが続く必要があります。列定義リストは、関数によって返される実際の列の数とタイプと一致する必要があります。

クリーンな解決策は、匿名レコードの代わりに既知のタイプを返すように関数を変更することです。状況に応じて、さまざまな方法でそれを実行できます。関数の書き直しに問題がある場合は、別の質問を開いてください。

于 2013-02-23T14:45:13.550 に答える