PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Estruturas de controle PL/pgSQL para listas/arrays

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

Pontos principais


  • O number da Oracle é numeric no Postgre . Mas se você não tem dígitos fracionários, você prefere usar int ou bigint em Postgres. Sobre mapeamento de tipos entre Oracle e Postgres.

  • O Postgres não tem "tipos de tabela" como o Oracle . Use tipos de array , uma matriz de numeric neste caso:numeric[] .

  • A expressão IF p_amount_list <> '{}' ... descartaria NULL e "matriz vazia" da mesma forma. Não há necessidade de uma segunda verificação como no seu original. Mas o IF não é necessário. Para matriz NULL ou vazia, o loop não é inserido de qualquer maneira.

  • r contém o elemento em si, não um índice para ele. (Portanto, deve ser um tipo de dados correspondente.)

Isso serve para demonstrar a sintaxe básica de um FOREACH loop em uma função plpgsql. Caso contrário, seria um absurdo caro , melhor substituído por um muito mais simples e rápido:
SELECT sum(elem) AS sum_amount
FROM   unnest(p_amount_list) elem;