これは、いくつかの実験が役立つような状況です(これは10gで実施されました)。次のクエリを使用すると、同じパラメータ(この場合はなし)を使用する通常の関数が呼び出されるたびに実行されることがわかります。
select dbms_random.value() from all_tables
これは、特に指定しない限り、関数が一貫して同じ値を返すことはないとOracleが想定しているためです。 deterministic
を使用して関数を作成することでそれを行うことができます キーワード:
CREATE FUNCTION rand_det
RETURN NUMBER
DETERMINISTIC AS
BEGIN
RETURN DBMS_RANDOM.VALUE ();
END;
dbms_random
の代わりにこの関数を使用する 最初のクエリでは、呼び出しが多いにもかかわらず、クエリが1回だけ実行されていることがわかります。ただし、これは select
を明確にするだけです。 セクション。 select
の両方で同じ決定論的関数を使用するとどうなりますか およびwhere
句。次のクエリを使用してテストできます:
SELECT rand_det
FROM all_tables
WHERE rand_det > .5;
証明を確認するには、これを数回実行する必要があるかもしれませんが、最終的には、0.5未満の値のリストが表示されます。これにより、決定論的関数でさえ2回実行されているという証拠が得られます。セクションごとに1回ずつ実行されます。別の方法として、決定論的関数を次のように変更してから、後続のクエリを実行すると、<に書き込まれた2行が表示されます。 code> 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;