PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Cấu trúc điều khiển PL / pgSQL cho danh sách / mảng

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ụng int hoặc bigint 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ưng IF 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;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Không thể tạo EntityManager trong JavaFx

  2. Tạo MERGE trên PostgreSQL 9.5

  3. Cài đặt PostgresSQL không thành công:khởi tạo cụm cơ sở dữ liệu không thành công MAC os

  4. Làm thế nào để bạn xác định các hàm postgres trong Rails và phạm vi cũng như thời gian tồn tại của chúng là gì?

  5. Tại sao người lập kế hoạch đưa ra các kết quả khác nhau cho các chức năng có độ bay hơi khác nhau?