ファンクションとは、単一の値を戻すサブプログラムのことです。 ファンクションは、起動する前に定義および宣言する必要があります。 ファンクションは、宣言と定義を同時に行うか、または最初に宣言して、後で同じブロック内で定義することができます。
注意: このトピックの内容は、PL/SQLブロックまたはパッケージ内で宣言および定義するファンクションに適用されます。このファンクションは、CREATE FUNCTION文を使用して作成するスタンドアロン・ストアド・ファンクションとは異なります。 |
構文
function_declaration ::=
function_heading ::=
(parameter_declaration ::=、datatype ::=)
function_definition ::=
(body ::=、declare_section ::=)
result_cache_clause ::=
キーワードとパラメータの説明
body
ファンクションの必須の実行部、およびオプションでファンクションの例外処理部。
RETURN
文へ導く少なくとも1つの実行パスが必要です。実行パスがないと、ランタイム・エラーが発生します。
data_source
データベース表またはデータベース・ビューの名前。
declare_section
ファンクションのオプションの宣言部。 宣言は、ファンクションに対してローカルであり、body
で参照でき、ファンクションが実行を完了すると消滅します。
DETERMINISTIC
を指定して、ファンクションが、そのパラメータの同じ値によって起動されたときは常に同じ結果値を戻すことを示します。 これは、オプティマイザが冗長ファンクション・コールを回避するのに役立ちます。ストアド・ファンクションが以前に同じ引数で起動された場合、オプティマイザは、以前の結果を使用できます。
コールごとに結果が変わる可能性があるため、結果をセッション変数またはスキーマ・オブジェクトの状態に依存するファンクションには、DETERMINISTIC
を指定しないでください。 かわりに、ファンクションの結果をキャッシュすることを考慮してください(「結果がキャッシュされるファンクションによるセッション固有の設定の処理」および「結果がキャッシュされるファンクションによるセッション固有のアプリケーション・コンテキストの処理」を参照)。
DETERMINISTIC
ファンクションのみを、ファンクションベースの索引またはクエリー・リライトを使用可能にしたマテリアライズド・ビューから起動できます。 DETERMINISTIC
オプションの詳細および制限については、「CREATE FUNCTION文」を参照してください。
参照: 『Oracle Database SQL言語リファレンス』のCREATE INDEX 文に関する項 |
function_declaration
ファンクションを宣言しますが、定義はしません。 定義は、同じブロックまたはサブプログラム内に後で宣言として存在している必要があります。
ファンクション宣言は、ファンクション仕様部とも呼ばれます。
function_definition
同じブロックまたはサブプログラムですでに宣言済のファンクションを定義するか、またはファンクションを宣言および定義します。
function_name
宣言または定義するファンクションに付ける名前。
IN、OUT、IN OUT
仮パラメータのアクションを定義するパラメータ・モード。 パラメータ・モードの概要は、表8-1を参照してください。
NOCOPY
NOCOPY
を指定すると、可能なかぎりすぐにこの引数を渡すようにデータベースに指示できます。 この句によって、レコード、索引付き表、VARRAYなどの大きい値をOUT
またはIN
OUT
パラメータに渡す場合にパフォーマンスを大幅に向上させることができます。 IN
パラメータ値は、常にNOCOPY
に渡されます。
NOCOPY
を指定した場合、パッケージ変数がこのパラメータに対応する実際の代入として渡されると、パッケージ変数に対して行われた代入がこのパラメータにすぐに表示されるか、またはこのパラメータに対して行われた代入がパッケージ変数にすぐに表示されます。
同様に、両方に同じ変数が渡されると、このパラメータまたは別のパラメータに対して行われた変更がすぐに表示されます。
ファンクションが未処理例外を戻して終了した場合は、このパラメータに対して行われた代入がコール元の変数に表示されます。
このような効果がないコールもあります。 NOCOPY
は、このような効果が発生しても問題がない場合にのみ使用する必要があります。
parameter_name
宣言する仮パラメータの名前。この名前は、body
で参照できます。
PIPELINED
PIPELINED
は、テーブル・ファンクションの結果を反復的に戻すことを指定します。 テーブル・ファンクションは、SQLデータ型の要素を含むコレクション型(ネストした表またはVARRAY)を戻します。 SQL問合せのFROM
句のファンクション名の前にTABLE
キーワードを使用して、テーブル・ファンクションを問い合せることができます。 詳細は、「パイプライン・テーブル・ファンクションによる複数変換の実行」を参照してください。
ファンクションの結果が依存するデータ・ソースを指定します。 詳細は、「PL/SQLファンクション結果キャッシュの使用」を参照してください。
ファンクションの結果をキャッシュします。 詳細は、「PL/SQLファンクション結果キャッシュの使用」を参照してください。
datatype
には、ファンクションの戻り値のデータ型を指定します。 戻り値は、PL/SQLでサポートされているすべてのデータ型にすることができます。 このデータ型は、NOT
NULL
などでは制約することができません。
{ := | DEFAULT } expression
IN
パラメータのデフォルト値を指定します。 ファンクションの実行者がパラメータの値を指定した場合、その起動のexpression
は評価されません(例8-7を参照)。 これ以外の場合、パラメータは、expression
の値に初期化されます。 その値とパラメータのデータ型には互換性が必要です。
関連トピック
参照: SQL文および式からコールされるユーザー定義ファンクションの制限の詳細は、『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』を参照してください。 |