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
-
numberspolečnosti Oracle jenumericv Postgres . Ale pokud nemáte desetinné číslice, raději použijteintnebobigintv Postgresu. O mapování typů mezi Oracle a Postgres. -
Postgres nemá "typy tabulek" jako Oracle . Použijte typy polí , pole
numericv 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. AleIFnení vůbec potřeba. Pro NULL nebo prázdné pole se smyčka stejně nezadává. -
robsahuje 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;