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
Huvudpunkter
-
Oracles
number
ärnumeric
i Postgres . Men om du inte har bråksiffror använder du hellreint
ellerbigint
i Postgres. Om typmappning mellan Oracle och Postgres. -
Postgres har inte "tabelltyper" som Oracle . Använd arraytyper , en matris med
numeric
i det här fallet:numeric[]
. -
Uttrycket
IF p_amount_list <> '{}' ...
skulle utesluta NULL och "tom array" likadant. Inget behov av en andra kontroll som i ditt original. MenIF
behövs inte alls. För NULL eller tom array läggs slingan inte in i alla fall. -
r
innehåller själva elementet, inte ett index för det. (Därför måste det vara en matchande datatyp.)
Detta visar grundläggande syntax för en FOREACH
loop i en plpgsql-funktion. Annars vore det dyrt nonsens , bättre att ersätta med en mycket enklare och snabbare:
SELECT sum(elem) AS sum_amount
FROM unnest(p_amount_list) elem;