Este é o tipo de situação em que alguma experimentação é útil (isso foi realizado em 10g). Usando a seguinte consulta, podemos dizer que funções normais, usando os mesmos parâmetros (neste caso, nenhum) serão executadas toda vez que forem chamadas:
select dbms_random.value() from all_tables
Isso ocorre porque o Oracle assume que uma função não retornará o mesmo valor de forma consistente, a menos que você informe o contrário. Podemos fazer isso criando uma função usando o método
deterministic
palavra-chave:CREATE FUNCTION rand_det
RETURN NUMBER
DETERMINISTIC AS
BEGIN
RETURN DBMS_RANDOM.VALUE ();
END;
Usando esta função em vez de
dbms_random
na primeira consulta nos diz que a consulta está sendo executada apenas uma vez, apesar das muitas chamadas. Mas isso apenas esclarece o select
seção. E se usarmos a mesma função determinística em um select
e um where
cláusula. Podemos testar isso usando a seguinte consulta:SELECT rand_det
FROM all_tables
WHERE rand_det > .5;
Você pode ter que executar isso várias vezes para ver nossa prova, mas, eventualmente, você verá uma lista de valores menores que 0,5. Isso nos fornece evidências de que mesmo a função determinística está sendo executada duas vezes:uma vez para cada seção em que ela aparece. Como alternativa, você pode modificar nossa função determinística da seguinte maneira e executar a consulta subsequente, que revelará 2 linhas gravadas em
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;