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

Thứ tự theo / giới hạn được tham số hóa PostgreSQL trong hàm bảng

Không có gì sai với hàm plpgsql cho bất cứ điều gì phức tạp hơn một chút. Tình huống duy nhất mà hiệu suất có thể bị ảnh hưởng là khi một hàm plpgsql được lồng vào nhau, vì trình lập kế hoạch truy vấn không thể tối ưu hóa thêm mã được chứa trong ngữ cảnh của truy vấn bên ngoài, điều này có thể làm cho nó chậm hơn hoặc không.
Chi tiết thêm về điều này sau câu trả lời:

  • Sự khác biệt giữa ngôn ngữ sql và ngôn ngữ plpgsql trong các hàm PostgreSQL

Trong trường hợp trong tầm tay đơn giản hơn rất nhiều CASE mệnh đề trong một truy vấn:

CREATE OR REPLACE FUNCTION get_stuff(_param text, _orderby text, _limit int)
  RETURNS SETOF stuff AS
$func$
BEGIN
   RETURN QUERY EXECUTE '
      SELECT *
      FROM   stuff
      WHERE  col = $1
      ORDER  BY ' || quote_ident(_orderby) || ' ASC
      LIMIT  $2'
   USING _param, _limit;
END
$func$  LANGUAGE plpgsql;

Gọi:

SELECT * FROM get_stuff('hello', 'col2', 100);

Ghi chú

Sử dụng RETURN QUERY EXECUTE để trả về kết quả của truy vấn trong một lần.

Sử dụng quote_ident() cho số nhận dạng để bảo vệ chống lại SQLi.
Hoặc format() cho bất cứ điều gì phức tạp hơn. Xem:

  • Tên bảng dưới dạng tham số hàm PostgreSQL

Chuyển các giá trị tham số bằng USING mệnh đề tránh truyền, trích dẫn và SQLi một lần nữa.

Hãy cẩn thận để không tạo ra xung đột đặt tên giữa các tham số và tên cột. Tôi đặt trước tên thông số bằng dấu gạch dưới (_ ) trong ví dụ. Chỉ là sở thích cá nhân của tôi.

Chức năng thứ hai của bạn sau khi chỉnh sửa không thể hoạt động, vì bạn chỉ trả về parent trong khi kiểu trả về được khai báo SETOF stuff . Bạn có thể khai báo bất kỳ kiểu trả về bạn thích, nhưng giá trị trả về thực tế phải khớp với khai báo. Bạn có thể muốn sử dụng RETURNS TABLE cho điều đó.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách tìm các bản ghi trùng lặp trong PostgreSQL

  2. Lỗi:Không thể tạo TypedQuery cho truy vấn có nhiều trả lại

  3. Heroku pg:pull không điền giản đồ

  4. Oracle chuyển sang PostgreSQL:Lý do nên di chuyển

  5. Hiệu suất của chuỗi và chuỗi trong Postgres-XL