Det här är den typen av situation där vissa experiment är användbara (detta utfördes på 10g). Med hjälp av följande fråga kan vi se att normala funktioner som använder samma parametrar (i detta fall ingen) kommer att exekveras varje gång de anropas:
select dbms_random.value() from all_tables
Detta beror på att Oracle antar att en funktion inte kommer att returnera samma värde konsekvent om du inte säger något annat. Vi kan göra det genom att skapa en funktion med deterministic
nyckelord:
CREATE FUNCTION rand_det
RETURN NUMBER
DETERMINISTIC AS
BEGIN
RETURN DBMS_RANDOM.VALUE ();
END;
Använder denna funktion istället för dbms_random
i den första frågan berättar att frågan körs endast en gång, trots många anrop. Men detta förtydligar bara select
sektion. Vad händer om vi använder samma deterministiska funktion i både en select
och en where
klausul. Vi kan testa det med följande fråga:
SELECT rand_det
FROM all_tables
WHERE rand_det > .5;
Du kan behöva köra detta flera gånger för att se vårt bevis, men så småningom kommer du att se en lista med värden som är mindre än 0,5. Detta ger oss bevis på att även den deterministiska funktionen exekveras två gånger:en gång för varje sektion den förekommer i. Som ett alternativ kan du modifiera vår deterministiska funktion enligt följande och sedan köra den efterföljande frågan, som kommer att avslöja 2 rader skrivna till 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;