Oracle
 sql >> Datenbank >  >> RDS >> Oracle

pl/sql-Funktion wie oft aufgerufen?

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 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;