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

PL/pgSQL Kontrollstrukturen für Listen / Arrays

CREATE OR REPLACE FUNCTION CREATE_PAYMENT(p_amount_list numeric[])
  RETURNS numeric AS
$func$
DECLARE
   s_chk_amnt numeric := 0; -- init variable!
   r          numeric;
BEGIN
-- IF p_amount_list <> '{}' THEN  -- just noise
   FOREACH r IN ARRAY p_amount_list
   LOOP
      s_chk_amnt := s_chk_amnt + r;
   END LOOP;
-- END IF;

RETURN s_chk_amnt;
END
$func$ LANGUAGE plpgsql

Wichtige Punkte

  • Oracles number ist numeric in Postgres . Aber wenn Sie keine Nachkommastellen haben, verwenden Sie lieber int oder bigint in Postgres. Über Typzuordnung zwischen Oracle und Postgres.

  • Postgres hat keine "Tabellentypen" wie Oracle . Verwenden Sie Array-Typen , ein Array von numeric in diesem Fall:numeric[] .

  • Der Ausdruck IF p_amount_list <> '{}' ... würde NULL und "leeres Array" gleichermaßen ausschließen. Keine zweite Überprüfung wie bei Ihrem Original erforderlich. Aber das IF wird überhaupt nicht benötigt. Bei NULL oder leerem Array wird die Schleife sowieso nicht betreten.

  • r enthält das Element selbst, keinen Index darauf. (Daher muss es ein passender Datentyp sein.)

Dies dient dazu, die grundlegende Syntax eines FOREACH zu demonstrieren Schleife in einer plpgsql-Funktion. Sonst wäre es teurer Unsinn , besser ersetzt durch ein viel einfacheres und schnelleres:

SELECT sum(elem) AS sum_amount
FROM   unnest(p_amount_list) elem;