Oracle
 sql >> Database >  >> RDS >> Oracle

funzione pl/sql chiamata quante volte?

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;