ユーザ定義関数

制限事項:このトピックは、Windows 環境 (ローカル開発) にのみ適用されます。

ユーザ定義関数 (User Defined Function; UDF) への参照を含むプログラムは、他のモジュールを呼び出します。そのモジュールには、適切な値を返すユーザ指定のコードが含まれています。UDF コード自体には、SQL は含まれません。

埋め込み SQL 文が含まれたプログラムを実行すると DB2 が呼び出されますが、ここからさらに DB2 が UDF モジュールを呼び出す場合もあります。UDF の宣言には、当該モジュールを記述する言語が指定されている必要があります。一部のプラットフォームでは COBOL でモジュールを記述することが可能ですが、現在 DB2 で許可されているのは C のみです。次の節では、例を使用して上記の内容がどのように行われるかを示します。ユーザ定義関数およびパラメータ記述の詳細については、DB2 のマニュアルを参照してください。

COBOL で記述されたユーザ定義関数は、現在 UNIX ではサポートされていません。

注:クライアント / サーバ構成では、UDF モジュールはサーバ上で呼び出されるため、これらの制限事項はサーバのみに適用されます。サーバが適切であれば、いずれのクライアントも UDF にアクセスできます。

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 上で) 見つけることができる場所に配置する必要があります。

注:エントリ・ポイント名は、すべてのシステムで大文字小文字が区別されます。大文字小文字の区別が合っていることに注意してください。また、CASE コンパイラ指令が指定されている (上記のプログラム例では $SET 文) 必要があります。