Tôi không rõ về ý nghĩa thực sự trong các định nghĩa cho các hàm IMMUTABLE, VOLATILE và STABLE.
Tôi đọc tài liệu, cụ thể là các định nghĩa của từng.
IMMUTABLE chỉ ra rằng hàm không thể sửa đổi cơ sở dữ liệu và luôn trả về cùng kết quả khi được cung cấp cùng giá trị đối số ; nghĩa là, nó không thực hiện tra cứu cơ sở dữ liệu hoặc sử dụng thông tin không có mặt trực tiếp trong danh sách đối số của nó. Nếu tùy chọn này được đưa ra, bất kỳ lệnh gọi nào của hàm với các đối số không đổi có thể được thay thế ngay lập tức bằng giá trị hàm.
STABLE chỉ ra rằng hàm không thể sửa đổi cơ sở dữ liệu và trong một lần quét bảng, nó sẽ trả về cùng một kết quả cho cùng các giá trị đối số , nhưng kết quả của nó có thể thay đổi trên các câu lệnh SQL. Đây là lựa chọn phù hợp cho các hàm có kết quả phụ thuộc vào tra cứu cơ sở dữ liệu, biến tham số (như múi giờ hiện tại), v.v. (Không phù hợp với trình kích hoạt SAU muốn truy vấn các hàng được sửa đổi bởi lệnh hiện tại.) Cũng lưu ý rằng Dòng chức năng current_timestamp đủ điều kiện là ổn định, vì giá trị của chúng không thay đổi trong một giao dịch.
VOLATILE chỉ ra rằng giá trị hàm có thể thay đổi ngay cả trong một lần quét bảng, do đó không thể tối ưu hóa. Tương đối ít chức năng cơ sở dữ liệu là không ổn định theo nghĩa này; một số ví dụ là ngẫu nhiên (), currentval (), timeofday (). Nhưng lưu ý rằng bất kỳ chức năng nào có tác dụng phụ đều phải được phân loại dễ bay hơi, ngay cả khi kết quả của nó hoàn toàn có thể dự đoán được, để ngăn các cuộc gọi không được tối ưu hóa; một ví dụ là setval ().
Sự nhầm lẫn của tôi đi kèm với các điều kiện để bất biến và ổn định chức năng LUÔN hoặc luôn trả về kết quả tương tự cho các đối số tương tự.
Định nghĩa IMMUTABLE nói rằng hàm không tra cứu cơ sở dữ liệu hoặc sử dụng thông tin không có mặt trực tiếp trong danh sách đối số của nó. Vì vậy, với tôi, điều đó có nghĩa là các chức năng như vậy được sử dụng để thao tác dữ liệu do khách hàng cung cấp và không nên có các câu lệnh CHỌN ... mặc dù điều đó nghe có vẻ hơi kỳ lạ đối với tôi.
Với STABLE, định nghĩa tương tự ở chỗ nó nói rằng nó sẽ luôn trả về cùng một kết quả. Vì vậy, với tôi, điều đó có nghĩa là mỗi khi hàm được gọi với cùng một đối số, nó sẽ trả về cùng một kết quả (cùng một hàng chính xác, mỗi lần duy nhất).
Vì vậy, với tôi ... điều đó có nghĩa là bất kỳ chức năng nào thực hiện CHỌN trên bảng hoặc bảng có thể được cập nhật, chỉ nên biến động.
Nhưng, một lần nữa ... điều đó không đúng với tôi.
Đưa điều này trở lại trường hợp sử dụng của tôi, tôi đang viết các hàm thực hiện các câu lệnh CHỌN với nhiều THAM GIA trên các bảng liên tục được thêm vào, do đó, các lệnh gọi hàm sẽ được trả về các kết quả khác nhau mỗi lần nó được gọi, ngay cả với cùng một đối số .
Vì vậy, điều đó có nghĩa là các chức năng của tôi phải là TỰ ĐỘNG? Mặc dù tài liệu chỉ ra tương đối ít chức năng cơ sở dữ liệu có biến động theo nghĩa này ?
Cảm ơn bạn!