PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Postgres Function End Loop und Rückgabefehler

Verwenden Sie OUT Parameter um eine einzelne Zeile mit mehreren Spalten zurückzugeben. Der RETURN type ist in diesem Fall optional, ich zitiere das Handbuch hier :

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;

Aufruf:

SELECT * FROM conta_relatos(1,2);

Ich habe auch Ihre Funktion stark vereinfacht. Unter anderem:

  • Verwenden Sie "Simple CASE" für Ihre Aufgaben.
  • Vereinfachen Sie zwei Abfragen zu einer mit einem Join.

Die gesamte Funktion könnte leicht als einzelne SQL-Anweisung umgeschrieben werden.