アプリケーション開発の手引き

コーディングに関するその他の考慮事項

この項では、UDF のインプリメント、留意すべきこと、禁止事項などに関する考慮事項を追加して説明します。

ヒントとアドバイス

以下に、UDF を正常にインプリメントするために考慮すべき点を示します。

UDF に関する制限と警告

この項では、UDF で回避すべき項目について説明します。

  1. 一般に DB2 は、オペレーティング・システム関数の使用を制限していない。次の 2 点は例外です。
    1. シグナル・ハンドラーや例外ハンドラーを登録すると、 DB2 がそれと同じハンドラーを使用できなくなり、予期せぬエラーを引き起こす。
    2. 処理を終了するシステム呼び出しを行うと DB2 の処理の 1 つが異常終了し、システム・エラーかアプリケーション・エラーが発生する。

      DB2 の通常の操作とやりとりしている場合、他のシステム呼び出しによって問題が発生することがあります。たとえば、UDF が含まれるライブラリーを UDF がメモリーからアンロードしようとすると、重大な問題が発生することがあります。システム呼び出しが含まれる UDF のコーディングとテストには注意してください。

  2. 'DB2' で始まるすべての環境変数の値は、データベース・マネージャーが db2start で開始される時点で収集され、 UDF (分離であるかどうかは関係ない) で使用できる。ただし DB2CKPTR 環境変数だけは例外です。環境変数は取り込まれる ということに注意してください。 db2start が発行された後に環境変数に対して加えられた変更は、 UDF では使用できません。
  3. 外部 UDF に渡される LOB については、 UDF 共用メモリー・サイズ の DB2 システム構成パラメーターにより指定される最大サイズに制限される。このパラメーターに指定できる最大数は 256M です。 DB2 における省略時設定は 1M です。このパラメーターの詳細については、 管理の手引き を参照してください。
  4. 画面およびキーボードに対する入出力は行わない方がよい。 DB2 の処理モデルでは、UDF はバックグラウンドで実行されるため画面に表示することはできません。ただし、ファイルに書き出すことはできます。
    注:DB2 は、UDF で行われる外部の入出力を DB2 独自のトランザクションと同期しようとはしません。したがって、たとえば UDF がトランザクション処理中にファイルに書き出され、そのトランザクションが後に何らかの理由で戻されると、 DB2 はそのファイルへの書き出しを発見したりやり直したりしようとはしません。
  5. UNIX ベースのシステムでは、 UDF は DB2 エージェント・プロセスのユーザー ID (NOT FENCED) や、実行可能な db2udf を持つユーザー ID (FENCED) 下で実行される。このユーザー ID は、UDF に利用できるシステム・リソースを制御します。ご使用のプラットフォーム用の db2udf 実行可能ファイルについては、 概説およびインストール を参照してください。
  6. 保護されたリソース (1 回で 1 つの処理にだけアクセスできるリソース) を UDF の内部で使用する際は、UDF 間のデッドロックを避けなければならない。 2 つ以上の UDF のデッドロックが発生すると、DB2 はその条件を検出できません。
  7. 文字データは、データベースのコード・ページ内の外部関数に渡される。同様に、関数から出力される文字ストリングは、データベースによりデータベースのコード・ページを使用すると想定されます。アプリケーションのコード・ページがデータベースのコード・ページとは異なる場合は、 SQL ステートメント内の別の値に対してと同様の方法でコード・ページの変換が行われます。このような変換は、FOR BIT DATA を文字パラメーターの属性として、または CREATE FUNCTION ステートメントの結果としてコーディングすることにより回避できます。文字パラメーターが FOR BIT DATA 属性を用いて定義されていない場合、 UDF コードはデータベースのコード・ページ内の引き数を受け取ります。

    CREATE FUNCTION で DBINFO オプションを使用すると、データベース・コード・ページが UDF に渡されることに注意してください。この情報を使用して、コード・ページを選ぶ UDF を多数の異なるコード・ページで機能するように定義することができます。

  8. C++ を使用して UDF を作成する場合は、次のようにして関数名を宣言できます。
         extern "C" void SQL_API_FN udf( ...arguments... )
    

    extern "C" は、 C++ コンパイラーによる関数名のタイプ修飾 (すなわち「マングル」) を防止します。この宣言の場合を除き、CREATE FUNCTION ステートメントを発行する場合には、関数名のタイプ修飾も組み込む必要があります。


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