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ärnumerici Postgres . Men om du inte har bråksiffror använder du hellreintellerbiginti Postgres. Om typmappning mellan Oracle och Postgres. -
Postgres har inte "tabelltyper" som Oracle . Använd arraytyper , en matris med
numerici 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. MenIFbehövs inte alls. För NULL eller tom array läggs slingan inte in i alla fall. -
rinnehå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;