ユーザー定義関数 (User Defined Function; UDF) への参照を含むプログラムは、他のモジュールを呼び出します。そのモジュールには、適切な値を返すユーザー指定のコードが含まれています。UDF コード自体には、SQL は含まれません。
埋め込み SQL 文が含まれたプログラムを実行すると DB2 が呼び出されますが、ここからさらに DB2 が UDF モジュールを呼び出す場合もあります。UDF の宣言には、当該モジュールを記述する言語が指定されている必要があります。一部のプラットフォームでは COBOL でモジュールを記述することが可能ですが、現在 DB2 で許可されているのは C のみです。次のセクションでは、例を使用して上記の内容がどのように行われるかを示します。ユーザー定義関数およびパラメーター記述の詳細については、DB2 のマニュアルを参照してください。
COBOL で記述されたユーザー定義関数は、現在 UNIX ではサポートされていません。
UDF のエントリ ポイントは、C の呼び出し規則を使用して定義する必要があります。次のサンプル コードのセグメントは、指数を計算する単純な UDF を使用および定義しています。
プログラム 1 は、DB2 への関数を宣言しています。まずこのプログラムをコンパイルおよび実行してから、プログラム 2 をコンパイルする必要があります。
exec sql create function mfexp(integer, integer) returns integer fenced external name 'db2v2fun!mfexp' not variant no sql parameter style db2sql language cobol no external action end-exec
ここで、LANGUAGE COBOL 句に注意してください。これは、DB2 構文への拡張として Micro Focus COBOL が提供しています。この句は LANGUAGE C に相当するものですが、どちらが使用されているかに関係なく、呼び出し先モジュールは C の呼び出し規則に準拠しています。この例では、EXTERNAL NAME 句で、呼び出し先モジュールが db2v2fun.dll という名前であり、その中のエントリ ポイントが mfexp であることが指定されています。
プログラム 2 は次の UDF を使用します。
move 2 to hv-integer move 3 to hv-integer-2 exec sql values (mfexp(:hv-integer, :hv-integer-2)) into :hv-integer-3 end-exec
プログラム 3 は、UDF 自体が含まれた純粋な COBOL プログラムです。
$set case special-names. call-convention 0 is cc. linkage section. 01 a pic s9(9) comp-5. 01 b pic s9(9) comp-5. 01 c pic s9(9) comp-5. 01 an pic s9(4) comp-5. 01 bn pic s9(4) comp-5. 01 cn pic s9(4) comp-5. 01 udf-sqlstate pic x(6). 01 udf-fname pic x(28). 01 udf-fspecname pic x(19). 01 udf-msgtext pic x(71). procedure division cc. goback . entry "mfexp" cc using a b c an bn cn udf-sqlstate udf-fname udf-fspecname udf-msgtext. if an not = 0 or bn not = 0 move -1 to cn else compute c = a ** b move 0 to cn end-if goback .
このモジュールをコンパイルして動的にロード可能な実行可能ファイル (dll) を作成し、オペレーティング システムが (PATH 上で) 見つけることができる場所に配置する必要があります。