プライマリ・コンテンツに移動
Oracle Database PL/SQL言語リファレンス
12c リリース1 (12.1)
B71296-06
目次へ移動
目次
索引へ移動
索引

前
次

ファンクションの宣言および定義

ファンクションとは、値を戻すサブプログラムのことです。値のデータ型は、ファンクションのデータ型になります。ファンクションの起動(コール)は式の一部で、そのデータ型はファンクションのデータ型です。

ファンクションは、起動する前に定義および宣言する必要があります。最初に宣言して(function_declarationを使用)、後で同じブロック、サブプログラムまたはパッケージ内で定義する(function_declarationを使用)か、または宣言と定義を同時に行う(function_declarationを使用)ことができます。

ファンクション宣言は、ファンクション仕様部とも呼ばれます。

注意:

このトピックの内容は、ネストされたファンクションに適用されます。スタンドアロン・ファンクションの詳細は、「CREATE FUNCTION文」を参照してください。パッケージ・ファンクションの詳細は、「CREATE PACKAGE文」を参照してください。

ここでのトピック

構文

function_declaration ::=

セマンティクス

function_declaration

ファンクションを宣言しますが、定義はしません。定義は、同じブロック、サブプログラムまたはパッケージ内に後で宣言として存在している必要があります。

DETERMINISTIC

同じパラメータ値を使用してファンクションが起動されたときは常に同じ値を戻すことをオプティマイザに示します(この前提が真でない場合は、DETERMINISTICを指定すると予測できない結果になります)。以前に同じパラメータ値を使用してファンクションが起動されている場合、オプティマイザは再度ファンクションを起動するかわりに以前の結果を使用できます。DETERMINISTICはファンクション内で1回のみ使用できます。

起動ごとに結果が変わる可能性があるため、結果がセッション変数またはスキーマ・オブジェクトの状態に依存するファンクションには、DETERMINISTICを指定しないでください。かわりに、ファンクションの結果をキャッシュすることを考慮してください(「結果がキャッシュされるファンクションによるセッション固有の設定の処理」および「結果がキャッシュされるファンクションによるセッション固有のアプリケーション・コンテキストの処理」を参照)。

DETERMINISTICファンクションのみを、ファンクションベースの索引またはクエリー・リライトを使用可能にしたマテリアライズド・ビューから起動できます。DETERMINISTICオプションの詳細および制限については、「CREATE FUNCTION文」を参照してください。

プログラミングにおいては、次のDETERMINISTICカテゴリに属するファンクションを作成するのが適切です。

  • WHERE句、ORDER BY句またはGROUP BY句の中で使用されるファンクション

  • SQL型のMAPメソッドまたはORDERメソッドであるファンクション

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

DETERMINISTICの制限

ネストしたファンクションにDETERMINISTICを指定することはできません。

関連項目:

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を使用することはできません。