DB2 LUW でのストアド プロシージャのコンパイルとリンク

DB2 LUW を使用した PL/I ストアド プロシージャのコンパイルとリンクは、大半の PL/I アプリケーションのコンパイルとリンクとは多少異なります。次の手順を使用して、DB2 LUW で DB2 ストアド プロシージャをコンパイルおよびリンクします。

  1. mfplx を使用し、DB2 LUW プログラムと同様に DB2 SQL オプションを使って、ストアド プロシージャとして使用するプログラムをコンパイルします。ここでは、OBJ ファイルのみを作成します。これを実行するには、mfplx-c コンパイラ オプションを指定します。
    プログラムにストアド プロシージャ CALL 文が含まれている場合は、CALL_RESOLUTION DB2 SQL オプションを指定して SQL エラー SQL0204 の発生を回避する必要があります。次に例を示します。
    mfplx -sql db2 -optsql DB=SAMPLE getprml.pli -nolaxdcl –ppsql -c
    注: -noaxdcl コンパイラ オプションを使用してストアド プロシージャをコンパイルし、宣言されない変数がないようにします。宣言されない変数は、ストアド プロシージャでさまざまな問題の原因になります。
  2. Windows:

    プログラムをダイナミック リンク ライブラリ (.dll) としてリンクするには、通常の PL/I リンク コマンドではなく CBLLINK を使用します。

    PL/I DB2 ストアド プロシージャをリンクするには、追加のモジュールをリンクして DB2 LUW で PL/I ランタイムと PL/I ルーチンを適切にロードできるようにする必要があります。

    ストアド プロシージャが MAIN の OPTION によって定義されない場合、systemsql.obj および setupdeffiles.obj オブジェクト モジュールを mfplimd.lib ライブラリ ファイルおよび 32 ビット db2api.lib ライブラリ ファイルとともにリンク コマンドに追加します。次に例を示します。

    cbllink /d /V /K GETPRML.obj db2api.lib mfplimd.lib systemsql.obj setupdeffiles.obj

    ストアド プロシージャが MAIN の OPTION によって定義されない場合、これらの追加モジュールをリンク コマンドでリンクします。

    • lpimainstub.obj
    • lpimain.obj
    • mfexttbl.lib

    次に例を示します。

    cbllink /d /V /K GETPRML.obj db2api.lib mfplimd.lib mfexttbl.lib systemsql.obj setupdeffiles.obj lpimainstub.obj lpimain.obj

    UNIX:

    ストアド プロシージャをリンクするには、cob を使用してモジュールをビルドすることで、ファイル拡張子がないモジュールにする必要があります。

    AIX プラットフォームでは、次のコマンドを使用して、ストアド プロシージャを実行可能ファイルとしてビルドします。

    cob -x GETPRML.o -e GETPRML -L$COBDIR/lib -lmfpliz -lplidump

    他の UNIX プラットフォームでは、次の形式のコマンドを使用して、ストアド プロシージャを自己格納式の呼び出し可能な共有オブジェクトとしてビルドします。

    cob -y GETPRML.o -o GETPRML -e GETPRML $COBDIR/lib/32/dllmain_cob.o -L$COBDIR/lib -lmfpliz -lplidump
  3. 生成されたストアド プロシージャ オブジェクトを DB2 インスタンスの function ディレクトリにコピーします。

    注: デフォルトで、ストアド プロシージャを呼び出した後、DB2 LUW は停止するまで呼び出したストアド プロシージャをアンロードしません。本番環境になければ、.dll のコピーに関する問題を避けるために次のいずれかの手順を使用できます。
    • db2stop を実行し、DLL をコピーして、DB2 管理コマンド プロンプトから db2start を実行します。

    • 次のコマンドを DB2 コマンド プロンプトから実行します。

    db2 update dbm cfg using KEEPFENCED NO

    本番環境では、このコマンドを実行するとパフォーマンスに著しく影響するため、使用しないでください。このコマンドの詳細については、IBM のドキュメントを参照してください。