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
numberdi Oracle ènumericin Postgres . Ma se non hai cifre frazionarie, preferisci usareintobiginta 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
numericin 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 ilIFnon è affatto necessario. Per NULL o array vuoto, il ciclo non viene comunque inserito. -
rcontiene 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;