Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

função pl/sql chamada quantas vezes?


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;