sql >> Base de Datos >  >> RDS >> Oracle

función pl/sql llamada ¿cuántas veces?

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;