PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Structures de contrôle PL/pgSQL pour les listes/tableaux

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 est numeric dans Postgres . Mais si vous n'avez pas de chiffres fractionnaires, vous préférez utiliser int ou bigint 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 le IF 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;