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
Belangrijkste punten
-
Oracle's
number
isnumeric
in Postgres . Maar als je geen gebroken cijfers hebt, gebruik je lieverint
ofbigint
in Postgres. Over typetoewijzing tussen Oracle en Postgres. -
Postgres heeft geen "tabeltypes" zoals Oracle . Gebruik arraytypen , een array van
numeric
in dit geval:numeric[]
. -
De uitdrukking
IF p_amount_list <> '{}' ...
zou zowel NULL als "lege array" uitsluiten. Geen tweede controle nodig zoals in uw origineel. Maar deIF
is helemaal niet nodig. Voor NULL of lege array wordt de lus toch niet ingevoerd. -
r
bevat het element zelf, geen index ervoor. (Daarom moet het een overeenkomend gegevenstype zijn.)
Dit demonstreert de basissyntaxis van een FOREACH
loop in een plpgsql-functie. Anders zou het dure onzin zijn , beter vervangen door een veel eenvoudiger en sneller:
SELECT sum(elem) AS sum_amount
FROM unnest(p_amount_list) elem;