Dies ist die Art von Situation, in der einige Experimente nützlich sind (dies wurde mit 10 g durchgeführt). Mit der folgenden Abfrage können wir feststellen, dass normale Funktionen mit denselben Parametern (in diesem Fall keine) bei jedem Aufruf ausgeführt werden:
select dbms_random.value() from all_tables
Dies liegt daran, dass Oracle davon ausgeht, dass eine Funktion nicht konsistent denselben Wert zurückgibt, es sei denn, Sie sagen es anders. Wir können das tun, indem wir eine Funktion mit deterministic
erstellen Stichwort:
CREATE FUNCTION rand_det
RETURN NUMBER
DETERMINISTIC AS
BEGIN
RETURN DBMS_RANDOM.VALUE ();
END;
Verwendung dieser Funktion anstelle von dbms_random
in der ersten Abfrage sagt uns, dass die Abfrage trotz der vielen Aufrufe nur einmal ausgeführt wird. Aber das verdeutlicht nur das select
Sektion. Was ist, wenn wir dieselbe deterministische Funktion in beiden select
verwenden und ein where
Klausel. Wir können das mit der folgenden Abfrage testen:
SELECT rand_det
FROM all_tables
WHERE rand_det > .5;
Möglicherweise müssen Sie dies mehrmals ausführen, um unseren Beweis zu sehen, aber schließlich sehen Sie eine Liste mit Werten unter 0,5. Dies liefert uns den Beweis, dass sogar die deterministische Funktion zweimal ausgeführt wird:einmal für jeden Abschnitt, in dem sie vorkommt. Alternativ können Sie unsere deterministische Funktion wie folgt ändern und dann die nachfolgende Abfrage ausführen, die 2 Zeilen anzeigt, die in
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;