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
istnumeric
in Postgres . Aber wenn Sie keine Nachkommastellen haben, verwenden Sie lieberint
oderbigint
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 dasIF
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;