Това е вид ситуация, при която някои експерименти са полезни (това беше проведено на 10g). Използвайки следната заявка, можем да кажем, че нормалните функции, използващи едни и същи параметри (в този случай нито един), ще бъдат изпълнени всеки път, когато бъдат извикани:
select dbms_random.value() from all_tables
Това е така, защото Oracle приема, че функцията няма да връща една и съща стойност последователно, освен ако не й кажете друго. Можем да направим това, като създадем функция, използваща deterministic
ключова дума:
CREATE FUNCTION rand_det
RETURN NUMBER
DETERMINISTIC AS
BEGIN
RETURN DBMS_RANDOM.VALUE ();
END;
Използване на тази функция вместо dbms_random
в първата заявка ни казва, че заявката се изпълнява само веднъж, въпреки многото извиквания. Но това само изяснява select
раздел. Ами ако използваме една и съща детерминистична функция и в двата select
и where
клауза. Можем да тестваме това, като използваме следната заявка:
SELECT rand_det
FROM all_tables
WHERE rand_det > .5;
Може да се наложи да изпълните това няколко пъти, за да видите нашето доказателство, но в крайна сметка ще видите списък със стойности, по-малки от 0,5. Това ни предоставя доказателство, че дори детерминистичната функция се изпълнява два пъти:веднъж за всеки раздел, в който се появява. Като алтернатива можете да промените нашата детерминистична функция, както следва, след което да изпълните последващата заявка, която ще разкрие 2 реда, записани на 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;