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
numberistnumericin Postgres . Aber wenn Sie keine Nachkommastellen haben, verwenden Sie lieberintoderbigintin Postgres. Über Typzuordnung zwischen Oracle und Postgres. -
Postgres hat keine "Tabellentypen" wie Oracle . Verwenden Sie Array-Typen , ein Array von
numericin 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 dasIFwird überhaupt nicht benötigt. Bei NULL oder leerem Array wird die Schleife sowieso nicht betreten. -
renthä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;