SQL CLR ストアド プロシージャ

OpenESQL アシスタントを使用して SQL CLR ストアド プロシージャを作成できます。このストアド プロシージャにより、選択したテーブル、クエリのタイプ、および列に基づいて SQL CLR プログラム全体が生成されます。このストアド プロシージャには、クエリの実行に必要なホスト変数が含まれています。

SQL CLR と互換性を保つように DB2 ストアド プロシージャを変換する必要がある場合には、ストアド プロシージャ定義 (SPD) ファイルを指定して SPD File Code Generator ツールを使用し、COBOL ラッパ プログラムを生成して元の DB2 ストアド プロシージャを呼び出すことができます。HCOSS Generate SPD File ツールを使用して、抽出した DB2 スキーマから SPD ファイルを生成できます。

SQL CLR ストアド プロシージャ内からの COBOL 呼び出しの発行

Enterprise Developer を使用する際、SQL CLR ストアド プロシージャは少なくとも次の 2 つのプロジェクトで構成されています。

  • COBOL コードが含まれている 1 つ以上の Visual Studio COBOL ライブラリ プロジェクト
  • SQL Server ストアド プロシージャとして実行するために COBOL コードのディプロイに使用する 1 つの SQL CLR .Publish プロジェクト

COBOL 呼び出しを正常に SQL CLR ストアド プロシージャ内からのルーチンに発行するには、次のいずれかを実行します。

  • 呼び出し先のルーチンをストアド プロシージャと同じ Visual Studio COBOL ライブラリ プロジェクトに含めてコンパイルします。これにより、そのルーチンがストアド プロシージャのアセンブリの一部として自動的に含められます。リテラルによるすべての CALL がコンパイル時に解決され、すべてのルーチングが 1 つのアセンブリに含められ、data-name によるすべての CALL が正しく実行されるため、この方法を強くお薦めします。
  • 呼び出し先のルーチンを Visual Studio COBOL ライブラリ プロジェクト、またはストアド プロシージャが含まれているプロジェクトとは異なるライブラリに含めてコンパイルします。

ストアド プロシージャの別のプロジェクトと呼び出し先の COBOL ルーチンを使用する場合、次の点に注意してください。

  • ディプロイを正しく行うには、呼び出し先のルーチンが含まれているすべての Visual Studio COBOL ライブラリ プロジェクトを参照する SQL CLR .Publish プロジェクトも更新する必要があります。
  • さらに、ストアド プロシージャが含まれているプロジェクトから呼び出し先のルーチンが含まれているプロジェクトへの参照を作成することをお勧めします。これにより、リテラルによるすべての CALL が静的になり、実行時にすべての CALL を正常に解決することができます。
呼び出し先のルーチンが含まれているアセンブリがロードされた場合にのみ、data-name による CALL とリテラルによる CALL (プロジェクト参照なし) が正しく実行されます。次のいずれかの方法を使用して、アセンブリをロードします。
  • ストアド プロシージャ コードで、呼び出しを発行する前に対応する PROCEDURE-POINTER を設定することで、呼び出し先のルーチンのプロジェクト アセンブリを事前ロードします。名前に .dll 拡張子を含めないでください。
  • 呼び出し先のルーチンのプロジェクト アセンブリの名前が呼び出し先のルーチンの名前と一致していることを確認します。

読み取り専用のカーソルのパフォーマンスの最適化

SQL CLR ストアド プロシージャで読み取り専用のカーソルのパフォーマンスを最適化するには、OpenESQL がそれらのストアド プロシージャをどのように処理しているかを理解する必要があります。SQL CLR ストアド プロシージャでは、MARS (Multiple Active Result Sets) 指令を使用できないため、アクティブな結果セットを処理するために回避策を提供するよう OpenESQL に要求します。実装されるソリューションは、Enterprise Developer のバージョンに応じて異なります。

Enterprise Developer 2.1 の Hot Fix 8 以降では、OpenESQL は、SQL CLR ストアド プロシージャでのスクロール不可能な読み取り専用の COBOL カーソルに DYNAMIC サーバー カーソル オプションではなく、FAST FORWARD を使用するようデフォルト設定されています。通常、FAST FORWARD カーソルにより、動的カーソルよりも優れたクエリ アクセス プランが生成されますが、クエリ プランの効率はファイアホース カーソルほど高くない場合があります。

このシナリオでは、OpenESQL DATASET カーソルに切り替えることで、サーバー カーソルを完全に使用することを回避できます。この変更により、DECLARE CURSOR 文自体のコード変更が分離されます。ただし、この方法では、ストアド プロシージャで使用されるメモリに結果セット全体が格納されるという欠点があります。結果セットが大きい、または多くのクライアントから同時にプロシージャが呼び出された場合、これにより、カーソルが開いている間に SQL Server のメモリを消費する可能性があります。さらに、DATASET カーソルが読み取り専用のカーソルに制限されていない間は、これらのカーソルをロックできません。つまり、ペシミスティック同時実行を使用できません (位置付け UPDATE が引き続きサポートされている場合でも)。これにより、アプリケーション ロジックが失敗する可能性があります。

OPTION=OPTIMIZESPCURSORS 指令、または Enterprise Developer 2.2 Update 1 以降の場合は OPTIMIZESPCURSORS 指令を使用することで、コード変更を完全に回避することができます。この場合、OpenESQL はファイアホース カーソルを開きます。カーソルを閉じる前にその他のデータベース アクセスが発生した場合、OpenESQL によって結果セットの残りの部分が DATASET カーソルに変換されます。

次の表に、オプションをまとめます。

ソース コードの変更 SQL Server カーソル 一時データベースのオーバーヘッド 最適なクエリ プラン メモリのオーバーヘッド 文ごとの制御
シングルトン選択 はい ファイアホース いいえ はい いいえ はい
読み取り専用のカーソル いいえ FAST FORWARD はい (ただし、更新可能なカーソルよりも少ない) 可能性 いいえ はい
DATASET カーソル はい (DECLARE CURSOR のみ) ファイアホース いいえ はい はい はい
OPTIMIZESPCURSORS を使用した読み取り専用のカーソル いいえ ファイアホース いいえ はい 可能性あり いいえ
更新可能なカーソル (比較のために使用) いいえ 動的 はい いいえ いいえ はい