Jest to sytuacja, w której przydatne są pewne eksperymenty (przeprowadzono je na 10g). Używając poniższego zapytania, możemy powiedzieć, że normalne funkcje, używające tych samych parametrów (w tym przypadku żadnego) będą wykonywane przy każdym wywołaniu:
select dbms_random.value() from all_tables
Dzieje się tak, ponieważ Oracle zakłada, że funkcja nie zwróci konsekwentnie tej samej wartości, chyba że powiesz inaczej. Możemy to zrobić, tworząc funkcję za pomocą deterministic
słowo kluczowe:
CREATE FUNCTION rand_det
RETURN NUMBER
DETERMINISTIC AS
BEGIN
RETURN DBMS_RANDOM.VALUE ();
END;
Używanie tej funkcji zamiast dbms_random
w pierwszym zapytaniu mówi nam, że zapytanie jest wykonywane tylko raz, pomimo wielu wywołań. Ale to wyjaśnia tylko select
Sekcja. Co jeśli użyjemy tej samej funkcji deterministycznej w obu select
? i where
klauzula. Możemy to przetestować za pomocą następującego zapytania:
SELECT rand_det
FROM all_tables
WHERE rand_det > .5;
Być może będziesz musiał uruchomić to kilka razy, aby zobaczyć nasz dowód, ale w końcu zobaczysz listę wartości mniejszych niż 0,5. Daje nam to dowód, że nawet funkcja deterministyczna jest wykonywana dwukrotnie:raz dla każdej sekcji, w której się pojawia. Alternatywnie, możesz zmodyfikować naszą funkcję deterministyczną w następujący sposób, a następnie uruchomić kolejne zapytanie, które pokaże 2 wiersze zapisane w 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;