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
Punti principali
-
Il
number
di Oracle ènumeric
in Postgres . Ma se non hai cifre frazionarie, preferisci usareint
obigint
a Postgres. Informazioni sulla mappatura dei tipi tra Oracle e Postgres. -
Postgres non ha "tipi di tabelle" come Oracle . Usa tipi di array , un array di
numeric
in questo caso:numeric[]
. -
L'espressione
IF p_amount_list <> '{}' ...
escluderebbe allo stesso modo NULL e "array vuoto". Non c'è bisogno di un secondo controllo come nel tuo originale. Ma ilIF
non è affatto necessario. Per NULL o array vuoto, il ciclo non viene comunque inserito. -
r
contiene l'elemento stesso, non un indice ad esso. (Pertanto deve essere un tipo di dati corrispondente.)
Questo serve a dimostrare la sintassi di base di un FOREACH
ciclo in una funzione plpgsql. Altrimenti sarebbe una costosa sciocchezza , meglio sostituito con un molto più semplice e veloce:
SELECT sum(elem) AS sum_amount
FROM unnest(p_amount_list) elem;