ユーザー定義関数 (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 上で) 見つけることができる場所に配置する必要があります。