ユーザー定義関数

ユーザー定義関数 (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 文) 必要があります。