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
Những điểm chính
-
Số
number
của Oracle lànumeric
trong Postgres . Nhưng nếu bạn không có chữ số phân số, bạn muốn sử dụngint
hoặcbigint
trong Postgres. Giới thiệu về ánh xạ kiểu giữa Oracle và Postgres. -
Postgres không có "loại bảng" như Oracle . Sử dụng loại mảng , một mảng
numeric
trong trường hợp này:numeric[]
. -
Biểu thức
IF p_amount_list <> '{}' ...
sẽ loại trừ NULL và "mảng trống" như nhau. Không cần kiểm tra lần thứ hai như trong bản gốc của bạn. NhưngIF
là không cần thiết ở tất cả. Đối với NULL hoặc mảng trống, vòng lặp vẫn chưa được nhập. -
r
giữ chính phần tử đó, không phải là một chỉ mục cho nó. (Do đó, nó phải là một kiểu dữ liệu phù hợp.)
Điều này chứng minh cú pháp cơ bản của FOREACH
vòng lặp trong một hàm plpgsql. Nếu không nó sẽ là vô nghĩa đắt tiền , tốt hơn được thay thế bằng đơn giản hơn và nhanh hơn nhiều:
SELECT sum(elem) AS sum_amount
FROM unnest(p_amount_list) elem;