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
Hlavní body
-
number
společnosti Oracle jenumeric
v Postgres . Ale pokud nemáte desetinné číslice, raději použijteint
nebobigint
v Postgresu. O mapování typů mezi Oracle a Postgres. -
Postgres nemá "typy tabulek" jako Oracle . Použijte typy polí , pole
numeric
v tomto případě:numeric[]
. -
Výraz
IF p_amount_list <> '{}' ...
by vyloučil NULL a "prázdné pole". Není potřeba druhá kontrola jako u vašeho originálu. AleIF
není vůbec potřeba. Pro NULL nebo prázdné pole se smyčka stejně nezadává. -
r
obsahuje samotný prvek, nikoli jeho index. (Musí se tedy jednat o odpovídající datový typ.)
Toto ukazuje základní syntaxi FOREACH
smyčka ve funkci plpgsql. Jinak by to byl drahý nesmysl , lepší nahradit mnohem jednodušším a rychlejším:
SELECT sum(elem) AS sum_amount
FROM unnest(p_amount_list) elem;