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

Chuyển nhiều bộ hoặc mảng giá trị cho một hàm

Bạn có thể đạt được điều đó với một hàm SQL đơn giản. Tính năng chính là hàm generate_subscripts() :

CREATE OR REPLACE FUNCTION f_attendance(_arr2d int[])
  RETURNS SETOF attendance AS
$func$
   SELECT a.*
   FROM   generate_subscripts($1, 1) i
   JOIN   attendance a ON a.class   = $1[i][1]
                      AND a.section = $1[i][2]
$func$  LANGUAGE ROWS 10 sql STABLE;

Gọi:

SELECT * FROM f_attendance(ARRAY[[1,1],[2,2]]);

Hoặc tương tự với mảng chữ - thuận tiện hơn trong một số ngữ cảnh, đặc biệt là với các câu lệnh chuẩn bị sẵn:

SELECT * FROM f_attendance('{{1,1},{2,2}}');

Chức năng luôn luôn mong đợi một mảng 2D. Ngay cả khi bạn vượt qua một cặp duy nhất, hãy lồng ghép nó:

SELECT * FROM f_attendance('{{1,1}}');

Kiểm tra việc triển khai của bạn

  1. Bạn đã tạo hàm VOLATILE , nhưng nó có thể là STABLE . Theo tài liệu:

    Do hành vi chụp nhanh này, một hàm chỉ chứa SELECT các lệnh có thể được đánh dấu một cách an toàn STABLE .

    Có liên quan:

    • Cách chuyển một tham số vào một hàm ngày tháng
  2. Bạn cũng sử dụng LANGUAGE plpgsql thay vì sql , điều này có ý nghĩa nếu bạn thực thi hàm nhiều lần trong cùng một phiên. Nhưng sau đó bạn cũng phải làm cho nó STABLE hoặc bạn mất lợi ích hiệu suất tiềm năng đó. Hướng dẫn sử dụng một lần nữa:

    STABLEIMMUTABLE các hàm sử dụng ảnh chụp nhanh được thiết lập kể từ khi bắt đầu truy vấn gọi, trong khi các hàm VOLATILE lấy ảnh chụp mới ở đầu mỗi truy vấn mà chúng thực thi.

  3. EXPLAIN của bạn đầu ra hiển thị Chỉ quét chỉ mục , không phải quét tuần tự như bạn nghi ngờ trong nhận xét của mình.

  4. Cũng có một bước sắp xếp trong EXPLAIN của bạn đầu ra không khớp với mã bạn hiển thị. Bạn có chắc là mình đã sao chép đúng EXPLAIN không sản lượng? Làm thế nào bạn có được nó dù sao? Các hàm PL / pgSQL là hộp đen để EXPLAIN . Bạn có sử dụng auto_explain không ? Chi tiết:

    • Kế hoạch truy vấn postgres của một lời gọi UDF được viết bằng pgpsql
  5. Công cụ lập kế hoạch truy vấn Postgres không biết tham số được truyền sẽ có bao nhiêu phần tử mảng, vì vậy rất khó lập kế hoạch cho truy vấn và nó có thể mặc định là quét tuần tự (tùy thuộc vào nhiều yếu tố hơn). Bạn có thể trợ giúp bằng cách khai báo số hàng dự kiến. Nếu bạn thường không có nhiều hơn 10 mục, hãy thêm ROWS 10 như tôi đã làm ở trên. Và kiểm tra lại.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL - Thay thế các thực thể HTML

  2. Thay đổi Cơ sở dữ liệu phát triển Django từ SQLite mặc định sang PostgreSQL

  3. Cách xác định khóa chính được tạo tự động được sử dụng làm khóa ngoại cho một bảng khác

  4. Java.sql.SQLException khét tiếng:Không tìm thấy trình điều khiển phù hợp

  5. PostgreSQL Tạo chỉ mục