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
Poin utama
-
number
Oracle adalahnumeric
di Postgres . Tetapi jika Anda tidak memiliki angka pecahan, Anda lebih suka menggunakanint
ataubigint
di Postgres. Tentang pemetaan tipe antara Oracle dan Postgres. -
Postgres tidak memiliki "tipe tabel" seperti Oracle . Gunakan jenis array , larik
numeric
dalam hal ini:numeric[]
. -
Ekspresi
IF p_amount_list <> '{}' ...
akan mengesampingkan NULL dan "array kosong" sama. Tidak perlu pemeriksaan kedua seperti pada aslinya. TapiIF
tidak diperlukan sama sekali. Untuk NULL atau array kosong, loop tetap tidak dimasukkan. -
r
memegang elemen itu sendiri, bukan indeks untuk itu. (Oleh karena itu harus menjadi tipe data yang cocok.)
Ini menunjukkan sintaks dasar dari FOREACH
loop dalam fungsi plpgsql. Kalau tidak, itu akan menjadi omong kosong yang mahal , lebih baik diganti dengan yang lebih sederhana dan lebih cepat:
SELECT sum(elem) AS sum_amount
FROM unnest(p_amount_list) elem;