ユーザー定義関数 (UDF) の作成

Db2 の SQL 機能を拡張するには、独自のまたはサード・パーティーのベンダーの機能定義を追加します。

始める前に

インストール手順 21: ストアド プロシージャおよびユーザー定義関数を実行するために Db2 構成する の説明に従って、ユーザー定義関数の環境をセットアップします。

このタスクについて

ユーザー定義関数 は、操作を実行するためにユーザーが作成できる小さいプログラムで、ホスト言語サブプログラムや関数に似たものです。 ただし、ユーザー定義関数は SQL ステートメント内で呼び出せるため、多くの場合 SQL アプリケーションにはユーザー定義関数の方が適しています。 ユーザー定義関数は、CREATE FUNCTIONステートメントを使用して作成され、カタログにDb2登録されます。

ユーザー定義関数は、関数名の後に、括弧で囲んだオペランドをゼロ個またはそれ以上指定することによって示されます。 ユーザー定義関数は、組み込み関数と同じように、入力値のセットと結果値のセットとの間の関係を表します。 関数定義では、関数への入力値はパラメーター と呼ばれます。 関数が呼び出される場合、関数への入力値は引数 と呼ばれます。 例えば、ある関数は日付/時刻のデータ・タイプを持つ 2 つの入力引数を受け 取り、結果としてタイム・スタンプのデータ・タイプを持つ値を戻します。

外部関数、SQL 関数、およびソース派生ユーザー定義関数を含め、複数の異なるタイプのユーザー定義関数を作成できます。 また、ユーザー定義関数は、スカラー関数 (単一値を戻す) または表関数 (表を戻す) としても分類できます。 具体的には、以下のタイプのユーザー定義関数を作成できます。

外部スカラー
この関数はプログラミング言語で書かれ、1 つのスカラー値を戻します。 外部実行可能ルーチン (パッケージ) は、関数の各種属性とともにデータベース・サーバーに登録されます。 関数が呼び出されるたびに、パッケージは1回または複数回実行されます。 CREATE FUNCTION 文(外部スカラー関数 )を参照してください。
外部表
関数はプログラミング言語で作成されます。 この関数は、関数が開始されるたびに一度に 1 行を戻すことにより、開始された副選択に対して表を戻します。 外部実行可能ルーチン (パッケージ) は、関数の各種属性とともにデータベース・サーバーに登録されます。 関数が呼び出されるたびに、パッケージは1回または複数回実行されます。 CREATE FUNCTION 文(外部テーブル関数 )を参照してください。
ソース派生
この関数は、サーバーに存在する別の関数 (組み込み、外部、SQL、またはソース派生のいずれか) を呼び出すことによって実装されます。 この関数は、基礎となるソース関数の属性を継承します。 ソース派生関数には、関連付けられたパッケージがありません。 CREATE FUNCTION 文(ソース関数 )を参照してください。
SQL スカラー
この関数は SQL ステートメントのみで作成され、スカラー値を戻します。 SQL スカラー関数の本体は、SQL プロシージャ言語(SQL PL)で記述されます。 関数は、関数の各種属性と一緒に現行サーバーで定義されます。
Db2は、インライン化およびコンパイルされた 2 つのタイプの SQL スカラー関数をサポートします。
  • インライン化された SQL スカラー関数 には、単純式の値を返す単一の RETURN ステートメントが含まれています。 この関数は照会の一部としては呼び出されません。代わりに、関数の RETURN ステートメントの expression が照会自体にコピー (インライン化) されます。 したがって、インライン化された SQL スカラー関数の場合、パッケージは生成されません。
  • コンパイル済み SQL スカラー関数 は、すべての SQL PL ステートメントを含む、より大きな機能セットをサポートします。 コンパイル済み SQL スカラー関数の場合、パッケージは生成されます。 これには、制御ステートメントを含む関数の本体が入っています。 また、Db2によって生成されたステートメントも含まれています。 関数が呼び出されるたびに、パッケージは1回または複数回実行されます。

SQL スカラー関数の CREATE FUNCTION ステートメントが処理されると、Db2はインライン化された SQL スカラー関数を作成しようとします。 関数がインライン関数として作成できない場合、Db2はコンパイル済み SQL スカラー関数を作成しようとします。 これらの関数の構文とルールに関する詳細は、「CREATE FUNCTION ステートメント(インライン SQL スカラー関数 )」および 「CREATE FUNCTION ステートメント(コンパイルされた SQL スカラー関数 )」を参照してください。

どのタイプの SQL スカラー関数が作成されるかを判別するには、SYSIBM.SYSROUTINES カタログ表の INLINE 列を参照してください。

SQL 表
この関数は SQL RETURN ステートメントのみで作成され、行セットを返します。 SQL 表関数の本体は SQL プロシージャー型言語でコーディングされています。 この関数は、現行サーバーでさまざまな属性と一緒に定義されます。 この関数は、照会の一部として呼び出されません。 その代わりに、関数の RETURN ステートメントのは、照会自体にコピー (インライン化) されます。 そのため、SQL 表関数に対してパッケージは生成されません。 CREATE FUNCTION 文(SQL テーブル関数 )を参照してください。

ユーザー定義関数の環境には、プログラムがユーザー定義関数を呼び出すアプリケーションアドレス空間が含まれます。 ユーザー定義関数からのパッケージが実行される Db2システムです。 WLMによって確立されたアドレス・スペース。ここで、ユーザー定義の機能を実行できます。下図のように、

図1: ユーザー定義関数環境
図 summary.A のボックスセットは、プログラムアドレス空間、 Db2、WLM アドレス空間間の流れを示しています。 詳細な説明をご用意しております。

Java™ユーザー定義関数に関する情報は、「Javaストアドプロシージャおよびユーザー定義関数 」を参照してください。 他の言語のユーザー定義関数については、以下の説明を参照してください。

プロシージャー

ユーザー定義関数を作成するには、次のようにします。

  1. 「外部ユーザー定義関数の作成」 で説明されているように、ユーザー定義関数を記述し、準備します。
    このステップが必要なのは、 外部ユーザー定義関数の場合のみです。
  2. 作成したい関数のタイプを指定したCREATE FUNCTION文を発行することで、 Db2 にユーザー定義関数を定義します。
    詳細はCREATE FUNCTION文(概要 )を参照してください。
  3. 「ユーザー定義関数の呼び出し」 で説明されているように、SQLアプリケーションからユーザー定義関数を呼び出します。

SQL ユーザー定義スカラー関数の定義

既存の組み込み SIN および COS 関数を使用して、 値のタンジェントを計算するために SQL ユーザー定義関数を定義できます。

CREATE FUNCTION TAN (X DOUBLE)
  RETURNS DOUBLE
  LANGUAGE SQL
  CONTAINS SQL
  DETERMINISTIC
  RETURN SIN(X)/COS(X);
この関数のロジックは、次のステートメントのように関数定義に含まれています。
RETURN SIN(X)/COS(X)

次の作業

関数を定義した後で、定義の一部を変更する必要があることがわかった場合は、ALTER FUNCTION ステートメントを使用して定義を変更することができます。 ユーザー定義関数定義の特性によっては、ALTER FUNCTION を使用して 変更できないものもあります。