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
Vigtige punkter
-
Oracles
number
ernumeric
i Postgres . Men hvis du ikke har brøktal, vil du hellere brugeint
ellerbigint
i Postgres. Om typekortlægning mellem Oracle og Postgres. -
Postgres har ikke "tabeltyper" som Oracle . Brug arraytyper , en matrix af
numeric
i dette tilfælde:numeric[]
. -
Udtrykket
IF p_amount_list <> '{}' ...
ville udelukke NULL og "tom array" ens. Intet behov for en ekstra kontrol som i din original. MenIF
er slet ikke nødvendig. For NULL eller tom matrix indtastes løkken alligevel ikke. -
r
indeholder selve elementet, ikke et indeks til det. (Derfor skal det være en matchende datatype.)
Dette viser den grundlæggende syntaks for en FOREACH
loop i en plpgsql-funktion. Ellers ville det være dyrt sludder , bedre erstattet med en meget enklere og hurtigere:
SELECT sum(elem) AS sum_amount
FROM unnest(p_amount_list) elem;