Este es el tipo de situación en la que es útil cierta experimentación (esto se llevó a cabo en 10g). Usando la siguiente consulta, podemos decir que las funciones normales, usando los mismos parámetros (en este caso, ninguno) se ejecutarán cada vez que se llamen:
select dbms_random.value() from all_tables
Esto se debe a que Oracle asume que una función no devolverá el mismo valor de manera constante a menos que le indique lo contrario. Podemos hacer eso creando una función usando el deterministic
palabra clave:
CREATE FUNCTION rand_det
RETURN NUMBER
DETERMINISTIC AS
BEGIN
RETURN DBMS_RANDOM.VALUE ();
END;
Usar esta función en lugar de dbms_random
en la primera consulta nos dice que la consulta se está ejecutando una sola vez, a pesar de las muchas llamadas. Pero esto solo aclara el select
sección. ¿Qué pasa si usamos la misma función determinista en ambos select
y un where
cláusula. Podemos probar eso usando la siguiente consulta:
SELECT rand_det
FROM all_tables
WHERE rand_det > .5;
Puede que tenga que ejecutar esto varias veces para ver nuestra prueba, pero, finalmente, verá una lista de valores inferiores a 0,5. Esto nos proporciona evidencia de que incluso la función determinista se ejecuta dos veces:una vez para cada sección en la que aparece. Como alternativa, puede modificar nuestra función determinista de la siguiente manera y luego ejecutar la consulta posterior, que revelará 2 líneas escritas en 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;