PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

La fonction Postgres termine la boucle et renvoie une erreur

Utilisez OUT paramètres pour renvoyer une seule ligne avec plusieurs colonnes. Le RETURN type est facultatif dans ce cas, je cite le manuel ici :

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$
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
   JOIN   "Fontes"   f ON f."ID" = v."Item"
   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;

-- No RETURN needed, OUT parameters are returned automatically.

END
$func$ LANGUAGE plpgsql;

Appel :

SELECT * FROM conta_relatos(1,2);

J'ai aussi grandement simplifié votre fonction. Entre autres :

  • Utilisez "Simple CASE" pour vos devoirs.
  • Simplifiez deux requêtes en une seule avec une jointure.

La fonction entière pourrait facilement être réécrite en une seule instruction SQL.