ファンクションとは、値を戻すサブプログラムのことです。値のデータ型は、ファンクションのデータ型になります。ファンクションの起動(コール)は式の一部で、そのデータ型はファンクションのデータ型です。
ファンクションは、起動する前に定義および宣言する必要があります。最初に宣言して(function_declarationを使用)、後で同じブロック、サブプログラムまたはパッケージ内で定義する(function_declarationを使用)か、または宣言と定義を同時に行う(function_declarationを使用)ことができます。
ファンクション宣言は、ファンクション仕様部とも呼ばれます。
注意:
このトピックの内容は、ネストされたファンクションに適用されます。スタンドアロン・ファンクションの詳細は、「CREATE FUNCTION文」を参照してください。パッケージ・ファンクションの詳細は、「CREATE PACKAGE文」を参照してください。
ここでのトピック
構文
function_declaration ::=
function_definition ::=
参照:
relies_on_clause ::=
セマンティクス
function_declaration
ファンクションを宣言しますが、定義はしません。定義は、同じブロック、サブプログラムまたはパッケージ内に後で宣言として存在している必要があります。
DETERMINISTIC
同じパラメータ値を使用してファンクションが起動されたときは常に同じ値を戻すことをオプティマイザに示します(この前提が真でない場合は、DETERMINISTIC
を指定すると予測できない結果になります)。以前に同じパラメータ値を使用してファンクションが起動されている場合、オプティマイザは再度ファンクションを起動するかわりに以前の結果を使用できます。DETERMINISTIC
はファンクション内で1回のみ使用できます。
起動ごとに結果が変わる可能性があるため、結果がセッション変数またはスキーマ・オブジェクトの状態に依存するファンクションには、DETERMINISTIC
を指定しないでください。かわりに、ファンクションの結果をキャッシュすることを考慮してください(「結果がキャッシュされるファンクションによるセッション固有の設定の処理」および「結果がキャッシュされるファンクションによるセッション固有のアプリケーション・コンテキストの処理」を参照)。
DETERMINISTIC
ファンクションのみを、ファンクションベースの索引またはクエリー・リライトを使用可能にしたマテリアライズド・ビューから起動できます。DETERMINISTIC
オプションの詳細および制限については、「CREATE FUNCTION文」を参照してください。
プログラミングにおいては、次のDETERMINISTIC
カテゴリに属するファンクションを作成するのが適切です。
WHERE
句、ORDER
BY
句またはGROUP
BY
句の中で使用されるファンクション
SQL型のMAP
メソッドまたはORDER
メソッドであるファンクション
結果セットに行を入れるかどうか、またはどこに入れるかを決定するファンクション
DETERMINISTICの制限
ネストしたファンクションにDETERMINISTIC
を指定することはできません。
関連項目:
『Oracle Database SQL言語リファレンス』のCREATE
INDEX
文に関する項
PIPELINED
テーブル・ファンクションでのみ使用し、このファンクションがパイプラインであることを指定します。パイプライン・テーブル・ファンクションは、行を処理した直後に起動元に行を戻し、行の処理を継続します。起動元に(制御を戻さずに)行を戻すために、このファンクションではPIPE ROW文を使用します。PIPELINED
はファンクション内で1回のみ使用できます。
PIPELINEDの制限
ネストしたファンクションにPIPELINED
を指定することはできません。
注意:
パイプライン・テーブル・ファンクションは、データベース・リンクを介して実行することはできません。パイプライン・テーブル・ファンクションの戻り型がユーザー定義のSQL型であり、単一データベース内でのみ使用可能であるためです(『Oracle Databaseオブジェクト・リレーショナル開発者ガイド』を参照)。パイプライン・テーブル・ファンクションの戻り型がPL/SQL型のように見える場合でも、そのPL/SQL型は実際にはデータベースによって対応するユーザー定義のSQL型に変換されます。
PARALLEL_ENABLE
ファンクションのパラレル実行を可能にし、パラレルDML評価のスレーブ・セッションで安全に使用できるようにします。PARALLEL_ENABLE
はファンクション内で1回のみ使用できます。
PARALLEL_ENABLEの制限
ネストしたファンクションにPARALLEL_ENABLE
を指定することはできません。
RESULT_CACHE
ファンクションの結果をキャッシュします。RESULT_CACHE
はファンクション内で1回のみ使用できます。詳細は、「PL/SQLファンクション結果キャッシュ」を参照してください。
RESULT_CACHEの制限
ネストしたファンクションにRESULT_CACHE
を指定することはできません。
function_heading
function
宣言または定義するファンクションの名前。
RETURN datatype
ファンクションが返す値のデータ型を指定します。任意のPL/SQLデータ型を指定できます(「PL/SQLデータ型」を参照)。
datatypeの制限
このデータ型は、NOT
NULL
などでは制約することができません。datatype
が制約付きサブタイプの場合、戻された値はサブタイプの制約を継承しません(詳細は、「制約付きサブタイプの仮パラメータ」を参照)。
function_definition
すでに宣言済のファンクションを定義するか、またはファンクションの宣言と定義の両方を行います。
declare_section
ファンクションに対してローカルであり、body
で参照でき、ファンクションが実行を完了すると消滅する項目を宣言します。
body
ファンクションの必須の実行部およびオプションの例外処理部。実行部には、RETURN
文へ導く1つ以上の実行パスが必要であり、実行パスがないと、ランタイム・エラーが発生します。
call_spec、EXTERNAL
「call_spec」および「EXTERNAL」を参照してください。
call_spec、EXTERNALの制限
これらの句は、パッケージ仕様部またはパッケージ本体でのみ使用できます。
relies_on_clause
ファンクションの結果が依存するデータ・ソースを指定します。それぞれのdata_source
がデータベース表またはデータベース・ビューの名前です。
注意:
この句は非推奨です。Oracle Database 12c以降は、結果がキャッシュされるファンクションの実行中に問い合せられるすべてのデータ・ソースがデータベースによって検出され、relies_on_clause
は何も実行しません。
無名ブロック内で宣言されたファンクションでrelies_on_clause
を使用することはできません。
例