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
-
Onumber
da Oracle énumeric
no Postgre . Mas se você não tem dígitos fracionários, você prefere usarint
oubigint
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 denumeric
neste caso:numeric[]
.
-
A expressãoIF 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 oIF
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;