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
Główne punkty
-
number
Oracle jestnumeric
w Postgresie . Ale jeśli nie masz cyfr ułamkowych, wolisz użyćint
lubbigint
w Postgresie. Informacje o mapowaniu typów między Oracle i Postgres. -
Postgres nie ma "typów tabel", takich jak Oracle . Użyj typów tablic , tablica
numeric
w tym przypadku:numeric[]
. -
Wyrażenie
IF p_amount_list <> '{}' ...
wykluczyłoby zarówno NULL, jak i „pustą tablicę”. Nie ma potrzeby ponownego sprawdzania, jak w oryginale. AleIF
w ogóle nie jest potrzebna. W przypadku tablicy NULL lub pustej pętla i tak nie jest wprowadzana. -
r
przechowuje sam element, a nie indeks do niego. (Dlatego musi to być zgodny typ danych.)
To pokazuje podstawową składnię FOREACH
pętla w funkcji plpgsql. W przeciwnym razie byłby to kosztowny nonsens , lepiej zastąpić znacznie prostszym i szybszym:
SELECT sum(elem) AS sum_amount
FROM unnest(p_amount_list) elem;