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
Points majeurs
-
number
d'Oracle estnumeric
dans Postgres . Mais si vous n'avez pas de chiffres fractionnaires, vous préférez utiliserint
oubigint
dans Postgres. À propos du mappage de type entre Oracle et Postgres. -
Postgres n'a pas de "types de table" comme Oracle . Utilisez types de tableaux , un tableau de
numeric
dans ce cas :numeric[]
. -
L'expression
IF p_amount_list <> '{}' ...
exclurait NULL et "tableau vide". Pas besoin d'un deuxième chèque comme dans votre original. Mais leIF
n'est pas du tout nécessaire. Pour NULL ou un tableau vide, la boucle n'est pas entrée de toute façon. -
r
contient l'élément lui-même, pas un index vers celui-ci. (Par conséquent, il doit s'agir d'un type de données correspondant.)
Cela va démontrer la syntaxe de base d'un FOREACH
boucle dans une fonction plpgsql. Sinon, ce serait un non-sens coûteux , mieux remplacé par un beaucoup plus simple et plus rapide :
SELECT sum(elem) AS sum_amount
FROM unnest(p_amount_list) elem;