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ố
numbercủa Oracle lànumerictrong Postgres . Nhưng nếu bạn không có chữ số phân số, bạn muốn sử dụnginthoặcbiginttrong 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
numerictrong 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ưngIFlà 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. -
rgiữ 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;