Dette er den slags situation, hvor nogle eksperimenter er nyttige (dette blev udført på 10g). Ved at bruge følgende forespørgsel kan vi se, at normale funktioner, der bruger de samme parametre (i dette tilfælde ingen), vil blive udført, hver gang de kaldes:
select dbms_random.value() from all_tables
Dette skyldes, at Oracle antager, at en funktion ikke vil returnere den samme værdi konsekvent, medmindre du fortæller det andet. Det kan vi gøre ved at oprette en funktion ved hjælp af deterministic
søgeord:
CREATE FUNCTION rand_det
RETURN NUMBER
DETERMINISTIC AS
BEGIN
RETURN DBMS_RANDOM.VALUE ();
END;
Brug af denne funktion i stedet for dbms_random
i den første forespørgsel fortæller os, at forespørgslen kun udføres én gang på trods af de mange opkald. Men dette tydeliggør kun select
afsnit. Hvad hvis vi bruger den samme deterministiske funktion i både en select
og en where
klausul. Vi kan teste det ved at bruge følgende forespørgsel:
SELECT rand_det
FROM all_tables
WHERE rand_det > .5;
Du skal muligvis køre dette flere gange for at se vores bevis, men til sidst vil du se en liste med værdier på mindre end 0,5. Dette giver os bevis for, at selv den deterministiske funktion udføres to gange:én gang for hver sektion, den vises i. Som et alternativ kan du ændre vores deterministiske funktion som følger og derefter køre den efterfølgende forespørgsel, som vil afsløre 2 linjer skrevet til 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;