日本語PDF

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メソッドであるファンクション

  • 結果セットに行を入れるかどうか、またはどこに入れるかを決定するファンクション

関連トピック

他の章:

その他のドキュメント: