Toto je typ situace, kdy je užitečné nějaké experimentování (to bylo provedeno na 10 g). Pomocí následujícího dotazu můžeme říci, že normální funkce se stejnými parametry (v tomto případě žádnými) budou provedeny pokaždé, když jsou volány:
select dbms_random.value() from all_tables
Je to proto, že Oracle předpokládá, že funkce nebude vracet stejnou hodnotu konzistentně, pokud jí neřeknete jinak. Můžeme to udělat vytvořením funkce pomocí deterministic
klíčové slovo:
CREATE FUNCTION rand_det
RETURN NUMBER
DETERMINISTIC AS
BEGIN
RETURN DBMS_RANDOM.VALUE ();
END;
Použití této funkce namísto dbms_random
v prvním dotazu nám říká, že dotaz se provádí pouze jednou, navzdory mnoha voláním. Ale to pouze objasňuje select
sekce. Co když použijeme stejnou deterministickou funkci v obou select
a where
doložka. Můžeme to otestovat pomocí následujícího dotazu:
SELECT rand_det
FROM all_tables
WHERE rand_det > .5;
Možná to budete muset spustit několikrát, abyste viděli náš důkaz, ale nakonec uvidíte seznam hodnot menší než 0,5. To nám poskytuje důkaz, že dokonce i deterministická funkce se provádí dvakrát:jednou pro každou sekci, ve které se objeví. Alternativně můžete naši deterministickou funkci upravit následovně a poté spustit následující dotaz, který odhalí 2 řádky zapsané do 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;