Dit is het soort situatie waarin enig experimenteren nuttig is (dit werd uitgevoerd op 10g). Met behulp van de volgende query kunnen we zien dat normale functies, die dezelfde parameters gebruiken (in dit geval geen) elke keer dat ze worden aangeroepen, worden uitgevoerd:
select dbms_random.value() from all_tables
Dit komt omdat Oracle ervan uitgaat dat een functie niet consistent dezelfde waarde retourneert, tenzij u het anders vertelt. We kunnen dat doen door een functie te maken met behulp van de deterministic
zoekwoord:
CREATE FUNCTION rand_det
RETURN NUMBER
DETERMINISTIC AS
BEGIN
RETURN DBMS_RANDOM.VALUE ();
END;
Deze functie gebruiken in plaats van dbms_random
in de eerste query vertelt ons dat de query maar één keer wordt uitgevoerd, ondanks de vele oproepen. Maar dit verduidelijkt alleen de select
sectie. Wat als we dezelfde deterministische functie gebruiken in zowel een select
en een where
clausule. We kunnen dat testen met de volgende query:
SELECT rand_det
FROM all_tables
WHERE rand_det > .5;
Mogelijk moet u dit meerdere keren uitvoeren om ons bewijs te zien, maar uiteindelijk ziet u een lijst met waarden kleiner dan 0,5. Dit geeft ons het bewijs dat zelfs de deterministische functie twee keer wordt uitgevoerd:één keer voor elke sectie waarin deze voorkomt. Als alternatief kunt u onze deterministische functie als volgt wijzigen en vervolgens de volgende query uitvoeren, die 2 regels onthult die zijn geschreven naar 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;