13.23 DETERMINISTIC句
deterministicオプションは、予測可能な結果を戻し、かつ副作用をもたらさないファンクションをマークします。
ファンクション索引、PL/SQLファンクションを使用する仮想列定義、およびクエリーリライトが有効なマテリアライズド・ビューは、特別なファンクション・プロパティを必要とします。DETERMINISTIC
句は、ファンクションにそれらのプロパティがあることを示します。
DETERMINISTICオプションは次の文に指定できます。
構文
deterministic_clause ::=
セマンティクス
deterministic_clause
DETERMINISTIC
ファンクションの宣言または定義にDETERMINISTIC
句が指定されている場合、そのファンクションは決定的です。
DETERMINISTIC
句は、ファンクションの宣言と定義でそれぞれ1回指定できます。
決定的ファンクションは、2つの異なる起動に対して、それらに指定された引数が同じであれば、同じ値を戻す必要があります。
DETERMINISTIC
ファンクションは、副作用をもたらさないものとします。
DETERMINISTIC
ファンクションは、未処理例外を生成しないものとします。
DETERMINISTIC
句のあるファンクションがこれらのセマンティクス・ルールのいずれかに違反すると、その起動の結果、その値、およびその起動元への影響はすべて未定義になります。
使用上のノート
DETERMINISTIC
句は、ファンクションがセマンティクス・ルールに従っていることを示すものです。ファンクションに違反があった場合、コンパイラ、SQL実行またはPL/SQL実行のいずれにおいても問題を診断できず、誤った結果が暗黙的に生成される可能性があります。
ファンクション索引の式(仮想列定義内)でファンクションを起動する場合、あるいはREFRESH
FAST
またはENABLE
QUERY
REWRITE
とマークされたマテリアライズド・ビューの問合せからファンクションを起動する場合、このキーワードを指定する必要があります。データベースでは、決定的ファンクションが検出されると、ファンクションが再実行されるのではなく、以前に計算した結果の使用が可能なかぎり試行されます。このファンクションを変更する場合は、依存するすべてのファンクション索引およびマテリアライズド・ビューを手動で再構築する必要があります。
起動ごとに結果が変わる可能性があるため、結果がセッション変数またはスキーマ・オブジェクトの状態に依存するファンクションには、DETERMINISTIC
を指定しないでください。
パッケージ変数を使用するファンクション、またはファンクションから戻される結果に影響を与える可能性のある方法でデータベースにアクセスするファンクションを定義する場合は、この句を指定しないでください。
多相テーブル・ファンクションでこの句を指定することはできません。
DETERMINISTIC
オプションが記述されている場合、コンパイラはマークを使用して、ファンクション実行のパフォーマンスを高めることができます。
プログラミングにおいては、次のDETERMINISTIC
カテゴリに属するファンクションを作成するのが適切です。
-
WHERE
句、ORDER
BY
句またはGROUP
BY
句の中で使用されるファンクション -
SQL型の
MAP
メソッドまたはORDER
メソッドであるファンクション -
結果セットに行を入れるかどうか、またはどこに入れるかを決定するファンクション
関連トピック
他の章:
その他のドキュメント:
-
『Oracle Database SQL言語リファレンス』の
CREATE
INDEX
文に関する項 -
マテリアライズド・ビューの詳細は、『Oracle Databaseデータ・ウェアハウス・ガイド』を参照してください。
-
ファンクション索引の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。