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
Puntos principales
-
number
de Oracle esnumeric
en Postgres . Pero si no tiene dígitos fraccionarios, prefiere usarint
obigint
en Postgres. Acerca de la asignación de tipos entre Oracle y Postgres. -
Postgres no tiene "tipos de tabla" como Oracle . Use tipos de matriz , una matriz de
numeric
en este caso:numeric[]
. -
La expresión
IF p_amount_list <> '{}' ...
descartaría NULL y "matriz vacía" por igual. No hay necesidad de un segundo cheque como en su original. Pero elIF
no es necesario en absoluto. Para NULL o matriz vacía, el ciclo no se ingresa de todos modos. -
r
contiene el elemento en sí, no un índice para él. (Por lo tanto, debe ser un tipo de datos coincidentes).
Esto sirve para demostrar la sintaxis básica de un FOREACH
bucle en una función plpgsql. De lo contrario, sería tonterías caras , mejor reemplazada por una mucho más simple y rápida:
SELECT sum(elem) AS sum_amount
FROM unnest(p_amount_list) elem;