Saya tidak jelas tentang arti sebenarnya dalam definisi untuk fungsi IMMUTABLE, VOLATILE dan STABLE.
Saya membaca dokumentasi, khususnya definisi masing-masing.
IMMUTABLE menunjukkan bahwa fungsi tidak dapat memodifikasi database dan selalu mengembalikan hasil yang sama ketika diberi nilai argumen yang sama ; yaitu, ia tidak melakukan pencarian basis data atau menggunakan informasi yang tidak secara langsung hadir dalam daftar argumennya. Jika opsi ini diberikan, panggilan fungsi apa pun dengan argumen semua-konstan dapat segera diganti dengan nilai fungsi.
STABEL menunjukkan bahwa fungsi tidak dapat memodifikasi database, dan bahwa dalam pemindaian tabel tunggal akan secara konsisten mengembalikan hasil yang sama untuk nilai argumen yang sama , tetapi hasilnya dapat berubah di seluruh pernyataan SQL. Ini adalah pilihan yang sesuai untuk fungsi yang hasilnya tergantung pada pencarian basis data, variabel parameter (seperti zona waktu saat ini), dll. (Tidak sesuai untuk pemicu SETELAH yang ingin meminta baris yang dimodifikasi oleh perintah saat ini.) Juga perhatikan bahwa current_timestamp keluarga fungsi memenuhi syarat sebagai stabil, karena nilainya tidak berubah dalam suatu transaksi.
VOLATILE menunjukkan bahwa nilai fungsi dapat berubah bahkan dalam satu pemindaian tabel, jadi tidak ada optimasi yang dapat dilakukan. Dalam beberapa hal fungsi database relatif tidak stabil; beberapa contoh acak (), currval (), timeofday (). Tetapi perhatikan bahwa setiap fungsi yang memiliki efek samping harus diklasifikasikan volatil, meskipun hasilnya cukup dapat diprediksi, untuk mencegah panggilan dioptimalkan; contohnya adalah setval ().
Kebingungan saya datang dengan kondisi untuk IMMUTABLE dan STABLE bahwa fungsi SELALU atau KONSISTEN mengembalikan hasil yang sama diberikan argumen yang sama.
Definisi IMMUTABLE menyatakan bahwa fungsi tersebut tidak mencari basis data atau menggunakan informasi yang tidak secara langsung hadir dalam daftar argumennya. Jadi, bagi saya, itu berarti fungsi seperti itu digunakan untuk memanipulasi data yang disediakan oleh klien, dan seharusnya tidak memiliki pernyataan SELECT ... walaupun itu kedengarannya agak aneh bagi saya.
Dengan STABLE, definisi ini serupa dengan yang dikatakannya harus konsisten mengembalikan hasil yang sama. Jadi, bagi saya, itu berarti bahwa setiap kali fungsi dipanggil dengan argumen yang sama, itu harus mengembalikan hasil yang sama (baris persis sama, setiap saat).
Jadi, bagi saya ... itu berarti bahwa setiap fungsi yang melakukan SELECT pada tabel atau tabel yang dapat diperbarui, seharusnya hanya volatile.
Tapi, sekali lagi ... itu kedengarannya tidak benar bagiku.
Membawa ini kembali ke kasus penggunaan saya, saya menulis fungsi yang melakukan pernyataan SELECT dengan beberapa GABUNG pada tabel yang terus-menerus ditambahkan, sehingga pemanggilan fungsi diharapkan untuk mengembalikan hasil yang berbeda setiap kali dipanggil, bahkan dengan argumen yang sama .
Jadi, apakah itu berarti bahwa fungsi saya harus VOLATILE? Meskipun dokumentasi menunjukkan fungsi database relatif sedikit volatile dalam pengertian ini ?
Terima kasih!