sql >> Base de Datos >  >> RDS >> PostgreSQL

Estructuras de control PL/pgSQL para listas/matrices

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 es numeric en Postgres . Pero si no tiene dígitos fraccionarios, prefiere usar int o bigint 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 el IF 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;