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
主なポイント
-
Oracleの
number
はnumeric
です。 Postgresで 。ただし、小数桁がない場合は、int
を使用することをお勧めします。 またはbigint
Postgresで。 OracleとPostgres間のタイプマッピングについて -
Postgresには、Oracleのような"テーブルタイプ"がありません 。 配列タイプ を使用します 、
numeric
の配列 この場合:numeric[]
。 -
式
IF p_amount_list <> '{}' ...
NULLと「空の配列」を同様に除外します。オリジナルのように2回目のチェックは必要ありません。しかし、IF
まったく必要ありません。 NULLまたは空の配列の場合、ループはとにかく入りません。 -
r
要素自体を保持し、そのインデックスではありません。 (したがって、一致するデータ型である必要があります。)
これは、FOREACH
の基本的な構文を示しています。 plpgsql関数でループします。そうでなければ、高価なナンセンスになります 、はるかに単純で高速なものに置き換える方がよい:
SELECT sum(elem) AS sum_amount
FROM unnest(p_amount_list) elem;