Đây là loại tình huống mà một số thử nghiệm hữu ích (điều này được thực hiện vào 10g). Sử dụng truy vấn sau, chúng ta có thể biết rằng các hàm bình thường, sử dụng cùng một tham số (trong trường hợp này là không có tham số nào) sẽ được thực thi mỗi khi chúng được gọi:
select dbms_random.value() from all_tables
Điều này là do Oracle giả định rằng một hàm sẽ không trả về cùng một giá trị nhất quán trừ khi bạn nói với nó theo cách khác. Chúng ta có thể làm điều đó bằng cách tạo một hàm sử dụng deterministic
từ khóa:
CREATE FUNCTION rand_det
RETURN NUMBER
DETERMINISTIC AS
BEGIN
RETURN DBMS_RANDOM.VALUE ();
END;
Sử dụng chức năng này thay vì dbms_random
trong truy vấn đầu tiên cho chúng ta biết rằng truy vấn chỉ được thực thi một lần, mặc dù có nhiều lệnh gọi. Nhưng điều này chỉ làm rõ select
tiết diện. Điều gì sẽ xảy ra nếu chúng ta sử dụng cùng một hàm xác định trong cả select
và một where
mệnh đề. Chúng tôi có thể kiểm tra điều đó bằng cách sử dụng truy vấn sau:
SELECT rand_det
FROM all_tables
WHERE rand_det > .5;
Bạn có thể phải chạy điều này nhiều lần để xem bằng chứng của chúng tôi, nhưng cuối cùng, bạn sẽ thấy danh sách các giá trị nhỏ hơn 0,5. Điều này cung cấp cho chúng tôi bằng chứng rằng ngay cả hàm xác định cũng đang được thực thi hai lần:một lần cho mỗi phần nó xuất hiện. Thay vào đó, bạn có thể sửa đổi hàm xác định của chúng tôi như sau, sau đó chạy truy vấn tiếp theo, truy vấn này sẽ hiển thị 2 dòng được viết cho 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;