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
-
numberde Oracle esnumericen Postgres . Pero si no tiene dígitos fraccionarios, prefiere usarintobiginten 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
numericen 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 elIFno es necesario en absoluto. Para NULL o matriz vacía, el ciclo no se ingresa de todos modos. -
rcontiene 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;