Ini adalah situasi di mana beberapa eksperimen berguna (ini dilakukan pada 10g). Dengan menggunakan kueri berikut, kita dapat mengetahui bahwa fungsi normal, menggunakan parameter yang sama (dalam hal ini, tidak ada) akan dieksekusi setiap kali dipanggil:
select dbms_random.value() from all_tables
Ini karena Oracle mengasumsikan bahwa suatu fungsi tidak akan mengembalikan nilai yang sama secara konsisten kecuali jika Anda memberi tahu sebaliknya. Kita dapat melakukannya dengan membuat fungsi menggunakan deterministic
kata kunci:
CREATE FUNCTION rand_det
RETURN NUMBER
DETERMINISTIC AS
BEGIN
RETURN DBMS_RANDOM.VALUE ();
END;
Menggunakan fungsi ini sebagai ganti dbms_random
di kueri pertama memberi tahu kita bahwa kueri hanya dieksekusi sekali, meskipun banyak panggilan. Tapi ini hanya menjelaskan select
bagian. Bagaimana jika kita menggunakan fungsi deterministik yang sama di kedua select
dan where
ayat. Kita dapat mengujinya dengan menggunakan kueri berikut:
SELECT rand_det
FROM all_tables
WHERE rand_det > .5;
Anda mungkin harus menjalankan ini beberapa kali untuk melihat bukti kami, tetapi, pada akhirnya, Anda akan melihat daftar nilai kurang dari 0,5. Ini memberi kami bukti bahwa bahkan fungsi deterministik dieksekusi dua kali:sekali untuk setiap bagian yang muncul. Sebagai alternatif, Anda dapat memodifikasi fungsi deterministik kami sebagai berikut, lalu jalankan kueri berikutnya, yang akan menampilkan 2 baris yang ditulis ke DBMS_OUTPUT
.
CREATE OR REPLACE FUNCTION rand_det
RETURN NUMBER
DETERMINISTIC AS
BEGIN
DBMS_OUTPUT.put_line ('Called!');
RETURN DBMS_RANDOM.VALUE ();
END;
SELECT rand_det
FROM all_tables;