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
Основни точки
-
number
на Oracle еnumeric
в Postgres . Но ако нямате дробни цифри, предпочитате да използватеint
илиbigint
в Postgres. Относно съпоставянето на типове между Oracle и Postgres. -
Postgres няма "типове таблици" като Oracle . Използвайте типове масиви , масив от
numeric
в този случай:numeric[]
. -
Изразът
IF p_amount_list <> '{}' ...
ще изключи NULL и "празен масив". Няма нужда от втора проверка, както в оригинала. НоIF
изобщо не е необходимо. За NULL или празен масив цикълът така или иначе не се въвежда. -
r
съдържа самия елемент, а не индекс към него. (Следователно трябва да е съвпадащ тип данни.)
Това демонстрира основния синтаксис на FOREACH
цикъл във функция plpgsql. В противен случай би било скъпа глупост , по-добре да се замени с много по-опростен и бърз:
SELECT sum(elem) AS sum_amount
FROM unnest(p_amount_list) elem;