Questo è il tipo di situazione in cui è utile un po' di sperimentazione (questo è stato condotto su 10 g). Utilizzando la seguente query, possiamo dire che le normali funzioni, utilizzando gli stessi parametri (in questo caso nessuno) verranno eseguite ogni volta che vengono chiamate:
select dbms_random.value() from all_tables
Questo perché Oracle presuppone che una funzione non restituirà lo stesso valore in modo coerente a meno che tu non dica diversamente. Possiamo farlo creando una funzione usando il deterministic
parola chiave:
CREATE FUNCTION rand_det
RETURN NUMBER
DETERMINISTIC AS
BEGIN
RETURN DBMS_RANDOM.VALUE ();
END;
Usando questa funzione invece di dbms_random
nella prima query ci dice che la query viene eseguita una sola volta, nonostante le numerose chiamate. Ma questo chiarisce solo il select
sezione. E se usiamo la stessa funzione deterministica in entrambi select
e un where
clausola. Possiamo verificarlo utilizzando la seguente query:
SELECT rand_det
FROM all_tables
WHERE rand_det > .5;
Potrebbe essere necessario eseguirlo più volte per vedere la nostra dimostrazione, ma, alla fine, vedrai un elenco di valori inferiori a 0,5. Questo ci fornisce la prova che anche la funzione deterministica viene eseguita due volte:una per ogni sezione in cui appare. In alternativa, puoi modificare la nostra funzione deterministica come segue, quindi eseguire la query successiva, che rivelerà 2 righe scritte in 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;