管理の手引き


ユーザー定義関数 (UDF) または方式の作成

ユーザー定義関数 (UDF) は、SQL の組み込み関数によるサポートを拡張および追加するものであり、 組み込み関数が使用できるところであればどこでも使用することができます。 UDF を、以下のいずれかとして作成することができます。

以下の 3 つのタイプの UDF があります。

スカラー
呼び出されるたびに、単一値の応答を戻します。 たとえば、組み込み関数 SUBSTR() はスカラー関数です。 スカラー UDF は、外部関数またはソース関数のいずれも可能です。

1 組みの類似値 (1 つの列) から、単一値の応答を戻します。 DB2 では、総計関数と呼ばれる場合もあります。 列関数の 1 つの例は、組み込み関数 AVG() です。 外部列 UDF を DB2 に定義することはできませんが、 組み込み列関数の 1 つのソース関数となる列 UDF は定義することができます。 これは、特殊タイプの場合に便利です。

たとえば、基本タイプ INTEGER で定義された特殊タイプ SHOESIZE がある場合、 組み込み関数 AVG(INTEGER) のソース関数となる UDF AVG(SHOESIZE) を定義することができ、 それは列関数になります。

それを参照する SQL ステートメントに対して 1 つの表を戻します。 表関数は、SELECT ステートメントの FROM 文節の中でのみ参照できます。 このような関数は、DB2 データでないデータのため、 またはそのようなデータを DB2 表に変換するために、 SQL 言語処理能力を利用するために使用できます。

たとえば、表関数は、ファイルを取り出してそれを表に変換するか、 ワールド・ワイド・ウェブ (WWW) からのサンプル・データを表の形にするか、 あるいは Lotus Notes データベースにアクセスして、 メール・メッセージの日付、送信者、テキストなどの情報を戻します。 この情報は、データベース内の他の表と結合することができます。

表関数は、外部関数のみが可能です。 ソース関数にはできません。

既存の UDF についての情報は、 SYSCAT.FUNCTIONS および SYSCAT.FUNCPARMS カタログ視点の中に記録されます。 システム・カタログには UDF の実行可能コードは含まれません。 (このため、バックアップおよび回復の計画を作成する場合には、 UDF 実行可能コードをどのように管理するかを考慮する必要があります。)

UDF のパフォーマンスに関する統計は、 SQL ステートメントをコンパイルするときに重要です。 システム・カタログ内の UDF 統計の更新方法については、 ユーザー定義関数の統計の更新を参照してください。

特定のアプリケーションに合わせて UDF を作成するための CREATE FUNCTION ステートメントの使用についての詳細は、 アプリケーション開発の手引き を参照してください。 UDF の構文の詳細は、SQL 解説書 を参照してください。

関数マッピングの作成

統合データベースでは、 1 つまたは複数のデータ・ソースを持つローカル関数またはローカル関数テンプレート (関数テンプレートの作成 に説明) をマップする必要があるときに、 関数マッピングを作成します。 多くのデータ・ソース関数で、省略時の関数マッピングが提供されています。

以下の場合に、関数マッピングが便利です。

CREATE FUNCTION MAPPING ステートメントで定義された関数マッピングは、 統合データ・ソースに保管されます。

関数 (関数テンプレート) には、 データ・ソース関数と同数の入力パラメーターを指定する必要があります。 さらに、統合される側の入力パラメーターのデータ・タイプと、 データ・ソース側の入力パラメーターのデータ・タイプには、互換性がなければなりません。

CREATE FUNCTION MAPPING ステートメントを、関数マッピングを作成するために使用します。 たとえば、 サーバー ORACLE1 で Oracle の AVGNEW 関数と DB2 の同等関数との関数マッピングを作成するには、 次のようにします。

   CREATE FUNCTION MAPPING ORAVGNEW FOR SYSIBM.AVG(INT) SERVER ORACLE1
   OPTIONS (REMOTE_NAME 'AVGNEW')

このステートメントを使用するには、 統合データベースで SYSADM または DBADM 権限のいずれかを持っている必要があります。 関数マッピングの属性は SYSCAT.FUNCMAPPINGS に保管されます。

統合サーバーは入力ホスト変数をバインドしたり、LOB、 LONG VARCHAR/VARGRAPHIC、 DATALINK、 特殊および構造型タイプの結果を検索したりしません。 入力パラメーターまたは戻り値に上記のいずれかのタイプが含まれていると、 関数マッピングは作成できません。

関数マッピングの使用および作成についての詳細は、 アプリケーション開発の手引き を参照してください。 CREATE FUNCTION MAPPING 構文についての詳細は、 SQL 解説書 を参照してください。

関数テンプレートの作成

統合システムでは、 関数テンプレートによって関数マッピング用の"アンカー"が提供されます。 アンカーは、 該当する DB2 関数が統合サーバーに存在しない場合にデータ・ソース関数のマッピングを可能にするために使用します。 関数マッピングでは、関数テンプレートが存在するか、 または DB2 に同様の関数が備わっていなければなりません。

テンプレートとは関数シェル、すなわち、名前、入力パラメーター、 および戻り値にほかなりません。 関数にはローカルの実行可能コードはありません。

関数用のローカル実行可能コードがないため、データ・ソースに使用可能な関数があっても、 関数テンプレートの呼び出しが失敗するという可能性があります。 たとえば、次のような照会を考えてみます。

   SELECT myfunc(C1)
      FROM nick1
      WHERE C2 < 'A'

DB2 および nick1 が参照するオブジェクトの入ったデータ・ソースの照合順序が同じではない場合、 関数がデータ・ソースにある間に比較を行う必要があるため、照会は失敗します。 照合順序が同じであれば、比較操作は、 myfunc が参照する基礎関数を持つデータ・ソースで行うことができます。

関数 (関数テンプレート) には、 データ・ソース関数と同数の入力パラメーターを指定する必要があります。 統合される側の入力パラメーターのデータ・タイプと、 データ・ソース側の入力パラメーターのデータ・タイプには、互換性がなければなりません。 これらの要件は戻り値にも適用されます。

関数テンプレートは、 CREATE FUNCTION ステートメントに AS TEMPLATE キーワードを指定して作成します。 テンプレートを作成したら、 CREATE FUNCTION MAPPING ステートメントを使ってテンプレートをデータベースにマップします。

たとえば、サーバー S1 に関数 MYS1FUNC 用の関数テンプレートと関数マッピングを作成するには、 次のようにします。

   CREATE FUNCTION MYFUNC(INT) RETURNS INT AS TEMPLATE
 
   CREATE FUNCTION MAPPING S1_MYFUNC FOR MYFUNC(INT) SERVER S1 OPTIONS
   (REMOTE_NAME 'MYS1FUNC')

関数テンプレートの使用および作成についての詳細は、アプリケーション開発の手引き を参照してください。 CREATE FUNCTION 構文についての詳細は、SQL 解説書 を参照してください。


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]