DB2 のアプリケーションを作成する場合、要求されたアクションまたは演算を次のどちらかとして実行することができます。
新しい演算は、ご使用のアプリケーションのサブルーチンとして実行する方が簡単のように見えますが、 UDF の使用をお勧めするのにはもっともな理由があります。
新しい操作を、ユーザー・サイトに存在する他のユーザーやプログラムが活用できる場合、 UDF やメソッドはその操作を再利用するのに役立ちます。さらに、データベースの使用者が式を利用できる場合はいつでも SQL で操作を直接呼び出すことができます。 UDF の場合、データベースは、関数引き数のデータ・タイプのプロモーション (たとえば DECIMAL から DOUBLE など) を自動的に多数処理し、ユーザーの操作が互換性のある別のデータ・タイプに適用できるようにします。
自分の新規の操作をサブルーチンとして使用し、他の人たちが各自のプログラムでそれを使用できるようにすると便利で、これによって、DB2 に関数を定義する必要をなくすことができます。この場合、関係する他のすべてのアプリケーション開発者に通知し、利用するサブルーチンを効率的にパッケージする必要があります。ただし、通常はコマンド行プロセッサー (CLP) を使用してデータベースにアクセスするような、対話式ユーザーは無視されます。 CLP ユーザーは、データベース中の UDF やメソッド以外の関数を使用できません。このことは SQL (Lotus Approach など) を使用しかつ再コンパイルできない他のすべてのツールにも当てはまります。
UDF やメソッドをご使用のアプリケーションから呼び出す代わりに、データベース・エンジンから直接呼び出すと、パフォーマンスが飛躍的に向上しますが、処理を続けるために操作によってデータを修飾すると特に向上します。あるデータの処理を行う単純なシナリオを例に考えてみます。ただし、関数 SELECTION_CRITERIA() として表されるいくつかの選択基準が満たされているものとします。この場合、ご使用のアプリケーションは次の選択ステートメントを発行することができます。
SELECT A,B,C FROM T
アプリケーションは、各行を受け取るたびにデータに対して SELECTION_CRITERIA を実行し、データの処理を続けるかどうかを判別します。この例では、表 T のすべての行がアプリケーションに戻されなければなりません。しかし、SELECTION_CRITERIA() が UDF として使用されている場合は、アプリケーションは次のステートメントを発行することができます。
SELECT A,B,C FROM T WHERE SELECTION_CRITERIA(A,B) = 1
この場合、関係のある行のみがアプリケーションとデータベース間のインターフェースを介して渡されます。表が大きい場合、または SELECTION_CRITERIA に有効なフィルター機能が提供されている場合、パフォーマンスは格段に向上します。
また、ラージ・オブジェクト (LOB) を扱う場合にも UDF を使用してパフォーマンスを向上させることができます。 LOB タイプ中のある値から情報を抽出する関数があると、データベース・サーバー上ですぐに抽出を実行し、抽出した値のみをアプリケーションに戻すことができます。この方が、すべての LOB 値をアプリケーションに戻してから抽出を行うよりも効率的です。この関数を UDF としてパッケージするパフォーマンス値は、場合によってはかなり大きくなることもあります。 (LOB ロケーターを使用することによって、LOB の一部を抽出することもできます。同様のシナリオの例については、例: LOB 式の評価の据え置きを参照してください。)
さらに、CREATE FUNCTION ステートメントの RETURNS TABLE 文節を使用すれば、表関数 と呼ばれる UDF を定義することができます。表関数を使用すると、 DB2 データベースの外にあるデータ (非リレーショナル・データ・ストアーを含む) に対して関係操作および SQL の能力を非常に効率的に使用できます。表関数は、様々なタイプおよび意味を持つ個々のスカラー値を引き数とし、呼び出し元の SQL ステートメントに表を戻します。関係のあるデータのみを生成する表関数を作成して、不必要な行や列をなくすことができます。表関数の詳細については (使用できる場所についての規則を含む)、 SQL 解説書 を参照してください。
表を戻すメソッドは作成できません。
ユーザー定義特殊タイプ (UDT) (特殊タイプ とも言う) は、 UDF を使用してインプリメントすることができます。 UDT の詳細については、ユーザー定義特殊タイプを参照してください。 UDT に関する追加情報と、ここで説明したキャスト機能 の重要な概念については、 SQL 解説書 を参照してください。特殊タイプを作成する場合、特殊タイプとそのソース・タイプの間にキャスト機能が自動的に提供され、そのソース・タイプに基づいて =、>、 < などの比較演算子が与えられます。さらに追加する振る舞いがあれば、ユーザー自身が行わなければなりません。特殊タイプの振る舞いはデータベース中のすべての特殊タイプのユーザーがアクセスしやすい場所に明確に保持しておくべきであるため、そのインプリメンテーション機構として UDF を使用できます。
たとえば、1 メガバイトの BLOB で定義されている BOAT という特殊タイプがあるとします。 BLOB には、さまざまな未加工の仕様およびいくつかの図が含まれています。 BLOB ソース・タイプで定義されている特殊タイプを使用してボートのサイズを比較する場合、比較演算は自動的に生成されません。この場合、BOAT_COMPARE 関数を実行すると、選択した測度に基づいて一方のボートが他方より大きいかどうかを判別することができます。選択できるのは、変位、全長、メートル・トン、あるいは BOAT オブジェクトに基づいたその他の計算です。 BOAT_COMPARE 関数は、以下のように作成できます。
CREATE FUNCTION BOAT_COMPARE (BOAT, BOAT) RETURNS INTEGER ...
ユーザーの関数が、最初のボートの方が大きい場合は 1 を、 2 番目のボートの方が大きい場合に 2 を、両者が等しい場合は 0 を戻すならば、この関数を自分の SQL コードで使用してボートを比較することができます。たとえば、次の表を作成するとします。
CREATE TABLE BOATS_INVENTORY ( BOAT_ID CHAR(5), BOAT_TYPE VARCHAR(25), DESIGNER VARCHAR(40), OWNER VARCHAR(40), DESIGN_DATE DATE, SPEC BOAT, ... ) CREATE TABLE MY_BOATS ( BOAT_ID CHAR(5), BOAT_TYPE VARCHAR(25), DESIGNER VARCHAR(40), DESIGN_DATE DATE, ACQUIRE_DATE DATE, ACQUIRE_PRICE CANADIAN_DOLLAR, CURR_APPRAISL CANADIAN_DOLLAR, SPEC BOAT, ... )
すると次の SQL SELECT ステートメントを実行できます。
SELECT INV.BOAT_ID, INV.BOAT_TYPE, INV.DESIGNER, INV.OWNER, INV.DESIGN_DATE FROM BOATS_INVENTORY INV, MY_BOATS MY WHERE MY.BOAT_ID = '19GCC' AND BOAT_COMPARE(INV.SPEC, MY.SPEC) = 1
この単純な例を実行すると、 MY_BOATS 内の特定のボートよりも大きいすべてのボートを BOATS_INVENTORY から戻します。ただしこの例では、データベース・サーバー内で比較が行われているので、関係のある列のみがアプリケーションに戻されます。つまり、BOAT というデータ・タイプの値をまったく渡さないようにします。 BOAT は 1 メガバイトの BLOB データ・タイプに基づいているので、これにより記憶とパフォーマンスが大幅に向上します。