1

レコード型を返さない方法でこの関数を書き直す必要があります。その理由は、それを使用してビューを作成する必要があるためです。

CREATE OR REPLACE FUNCTION conta_relatos(IN _fator_normativo integer, IN _fator_determinativo integer, OUT rel_pri integer, OUT rel_sec integer, OUT rel_ref integer)
RETURNS record AS
$BODY$
DECLARE
  tipo_relato text;
BEGIN

rel_pri := 0;
rel_sec := 0;
rel_ref := 0;

FOR tipo_relato IN
   SELECT f."Tipo_Relato"
   FROM "Vinculos" v 
   INNER JOIN ("Fontes" f INNER JOIN "Itens" i ON f."ID" = i."Fonte") ON v."Item" = i."ID"
   WHERE  v."Fator_Normativo" = _fator_normativo
   AND    v."Fator_Determinativo" = _fator_determinativo
LOOP
   CASE tipo_relato
   WHEN '1 - Relato Primário' THEN 
       rel_pri := rel_pri + 1;
   WHEN '2 - Relato Secundário' THEN 
       rel_sec := rel_sec + 1;
   WHEN '3 - Relato Referencial' THEN 
       rel_ref := rel_ref + 1;
   END CASE;
END LOOP;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

この関数は、、 の3 つintの列を返す必要があります。rel_prirel_secrel_ref

4

1 に答える 1

2

複合型 (レコード/行) を返す関数を使用してクエリを機能させることができ、それを変更する必要はありません。前の質問
のエラー メッセージを誤解し、そこで回答を更新しました。

関数を書き直すトピックについて説明していますが、これは SQL ステートメントとして書き直すことができます (前に述べたように)。

SELECT COUNT (f."Tipo_Relato" = '1 - Relato Primário'    OR NULL) AS rel_pri
      ,COUNT (f."Tipo_Relato" = '2 - Relato Secundário'  OR NULL) AS rel_sec
      ,COUNT (f."Tipo_Relato" = '3 - Relato Referencial' OR NULL) AS rel_ref
FROM   "Vinculos" v 
JOIN   "Itens"    i ON i."ID" = v."Item"
JOIN   "Fontes"   f ON f."ID" = i."Fonte"
WHERE  v."Fator_Normativo" = _fator_normativo
AND    v."Fator_Determinativo" = _fator_determinativo;

これを既存の関数のドロップイン置換にするために、それをSQL 関数にラップできます。これは、おそらく現在のものよりも少し高速です。

CREATE OR REPLACE FUNCTION conta_relatos(
    _fator_normativo integer
   ,_fator_determinativo integer
   ,OUT rel_pri integer
   ,OUT rel_sec integer
   ,OUT rel_ref integer) AS
$func$
   SELECT COUNT (f."Tipo_Relato" = '1 - Relato Primário'    OR NULL) -- rel_pri
         ,COUNT (f."Tipo_Relato" = '2 - Relato Secundário'  OR NULL) -- rel_sec
         ,COUNT (f."Tipo_Relato" = '3 - Relato Referencial' OR NULL) -- rel_ref
   FROM   "Vinculos" v 
   JOIN   "Itens"    i ON i."ID" = v."Item"
   JOIN   "Fontes"   f ON f."ID" = i."Fonte"
   WHERE  v."Fator_Normativo" = _fator_normativo
   AND    v."Fator_Determinativo" = _fator_determinativo
$func$ LANGUAGE sql;
于 2013-02-23T17:19:19.937 に答える