SQL CLR ストアド プロシージャのトランザクション サポート

問題:SQL CLR 環境でシリアル トランザクション チェーンがサポートされていない

z/OS DB2 などの SQL CLR 以外の環境では、通常、COBOL ストアド プロシージャでの SQL アクティビティを通じて呼び出し元アプリケーションからトランザクションをチェーンすることができます。たとえば、COBOL クライアント アプリケーションから実行される次のシーケンスについて考えてみましょう。

EXEC SQL Insert 1 END-EXEC
EXEC SQL Call COBOL stored procedure A END-EXEC
     EXEC SQL Insert 2 END-EXEC
     Cobol call to COBOL routine B
          EXEC SQL Commit END-EXEC
          EXEC SQL Insert 3 END-EXEC
     EXEC SQL Rollback END-EXEC
     EXEC SQL Insert 4 END-EXEC
EXEC SQL Insert 5 END-EXEC
EXEC SQL Commit END-EXEC

The DBMS typically inserts records 1, 2, 4, and 5.

DBMS は、通常、レコード 1、2、4、5 を挿入します。

SQL CLR を使用する SQL Server では、アプリケーションが何らかのストアド プロシージャのフローを呼び出すと、チェーンされたトランザクションではなく入れ子になったトランザクションが形成されます。各トランザクションで実行された処理の内容にかかわらず、この入れ子になったトランザクションの最も外側のトランザクションが、含まれているすべてのトランザクションの作業をコミットするか、ロールバックするかを最終的に決定します。この例では、COBOL クライアント アプリケーションが入れ子になったトランザクションを開始し、COMMIT で終了しているため、5 つのレコードすべてが挿入されます。アプリケーションが COMMIT ではなく ROLLBACK で終了することもよくあり、その場合は 5 つのレコードはいずれも挿入されません。

この動作は、移行した SQL Server アプリケーションにシリアル トランザクション チェーンを模倣させる必要がある場合は、許容されません。

OpenESQL では、z/OS DB2 とまったく同じように常にチェーンされたトランザクションをコミットまたはロールバックすることはできませんが、この問題に対処するための SQLCLRTRANS コンパイラ指令オプションが用意されています。SQLCLRTRANS は、z/OS DB2 の動作をエミュレートし、MF__SAVEPOINT という SQL Server のセーブポイントを使用します。

考えられるソリューション:OpenESQL と SQLCLRTRANS の使用

ソリューション 1:完全なシリアル トランザクション チェーン
呼び出し元アプリケーションと呼び出し先ストアド プロシージャの両方で、コミットまたはロールバックする必要があるワークロードを実行する場合は、このソリューションの使用を検討してください。この場合、呼び出し元アプリケーションがトランザクションを開始し、上記のコード例に示されているものと同じシーケンスを使用してすべての DML が実行されることになります。
注:呼び出し元アプリケーション自体はトランザクションの管理に使用されない場合は、代わりに下記のソリューション 2 およびソリューション 3 を参照してください。
重要:このソリューションでは、下記の「コーディング要件」で説明されているように、シリアル トランザクション チェーンの期間中はオートコミット モードをオフにして呼び出し元アプリケーションを実行する必要があります。

このソリューションでは、SQLCLRTRANS コンパイラ指令オプションを使用して COBOL コードをコンパイルすると、OpenESQL によって自動的に次のコード調整が行われます。

表 1.ソリューション 1 – SQLCLRTRANS
ON ENTRY1 EXEC SQL COMMIT EXEC SQL ROLLBACK ON EXIT2
クライアント アプリケーション (COBOL のみ)

トランザクションの開始

セーブポイントの設定、MF_SAVEPOINT

コミット

セーブポイントの設定、MF_SAVEPOINT

ロールバック

セーブポイントの設定、MF_SAVEPOINT

ロールバック

接続の解除

先頭 (呼び出し先) ストアド プロシージャ

MF_SAVEPOINT のリセット

MF_SAVEPOINT までのロールバック

入れ子になったストアド プロシージャ

MF_SAVEPOINT のリセット

MF_SAVEPOINT までのロールバック

1 つまり、クライアント アプリケーションによって接続が開かれます。
2 戻る。つまり、クライアント アプリケーションによって接続が閉じられます。

ソリューション 1 の利点と欠点
このソリューションを使用する場合の利点と欠点は、次のとおりです。
利点
  • ストアド プロシージャ コードの変更が必要ない
  • COBOL 呼び出し元アプリケーションのコードの変更が最小限で済む
  • 入れ子になったストアド プロシージャがそのまま維持される
  • アプリケーションまたは呼び出し先ストアド プロシージャによって実行された作業が失われることがないため、データ整合性が最も高いソリューションである
欠点
  • コミットまたはロールバックがアプリケーションによって実際に実行されるまで、SQL Server でロックが保持される。この SQL Server のロックは、z/OS DB2 よりも、またソリューション 2 およびソリューション 3 よりも長い間保持されるため、データの並行性が低下する
  • COBOL 以外の呼び出し元プログラムでは、OpenESQL および SQLCLRTRANS 指令を使用してコードを自動的に挿入することができないため、シリアル トランザクション チェーンを有効にするためのコードの変更が必要となる
コーディング要件
このソリューションで考えられるコーディング要件は、SQL CLR COBOL ストアド プロシージャを呼び出すアプリケーションが COBOL で記述されているか別のプログラミング言語で記述されているかによって異なります。
COBOL SQL CLR ストアド プロシージャを呼び出す COBOL アプリケーション
COBOL SQL CLR ストアド プロシージャを呼び出すアプリケーション自体が COBOL である場合は、SQLCLRTRANS 指令を使用してコンパイルする前に、COBOL 呼び出し元アプリケーション コードに対して次の確認および変更を行います。
オートコミットの状態の確認/変更
デフォルトの COBOL OpenESQL アプリケーションはオートコミットをオフにして実行されます。アプリケーションで EXEC SQL 文によってオートコミットを明示的にオンにすることがなく、AUTOCOMMIT 指令を使用してコンパイルする必要もない場合は、「COMMIT または ROLLBACK の挿入」に進んでください。

ただし、AUTOCOMMIT 指令を使用してアプリケーションをコンパイルする場合、または COBOL アプリケーションでオートコミットを明示的にオンにする場合は、次の点を考慮してください。

AUTOCOMMIT 指令が必要な場合
AUTOCOMMIT SQL コンパイラ指令オプションを使用して COBOL コードをコンパイルすると、オートコミット モードが自動的にオンになります。これを回避する最も簡単な方法は、AUTOCOMMIT 指令を使用せずにコンパイルすることです。ただし、それが選択肢とならない場合は、次のようにアプリケーション コードを編集します。
  • オートコミット モードを一時的にオフにするには、ストアド プロシージャの呼び出しの前に、アプリケーション内の適切な場所にEXEC SQL SET AUTOCOMMIT OFF END-EXEC文を挿入します。
  • オートコミット モードを再度オンにするには、シリアル トランザクション チェーンのコミットまたはロールバックの後にEXEC SQL SET AUTOCOMMIT ON END-EXEC文を挿入します (詳細は、下記の「COMMIT または ROLLBACK の挿入」を参照してください)。
EXEC SQL SET AUTOCOMMIT ON END-EXEC を含む COBOL コードの場合
AUTOCOMMIT 指令を使用せずにコンパイルする場合でも、EXEC SQL SET AUTOCOMMIT ON END-EXEC文がコードに含まれていると、アプリケーションが部分的にオートコミット モードで実行されることがあります。この文がないかコードを調べて、見つかった場合は、各ストアド プロシージャの呼び出しの前にオートコミット モードをオフにし、後で再度オンにするようにアプリケーションを編集することをお奨めします。手順については、上記の「AUTOCOMMIT 指令が必要な場合」にある箇条書きを参照してください。
COMMIT または ROLLBACK の挿入
各 COBOL ストアド プロシージャを呼び出した後、EXEC SQL COMMIT END-EXEC文またはEXEC SQL ROLLBACK END-EXEC文を実行して、シリアル トランザクション チェーンの作業をコミットまたはロールバックし、SQL Server のロックを解除します。
重要:厳密には、常にオートコミットをオフにして実行している場合は、ストアド プロシージャの呼び出しの後に COMMIT または ROLLBACK を実行する必要はありません。代わりに、呼び出し元アプリケーションで適切と考えられるようにその実行を遅らせることができます。ただし、COMMIT または ROLLBACK の実行を遅延してもシリアル トランザクション チェーンの完了は遅延しないことに注意してください。このような遅延により、SQL Server データの並行性に関する問題が発生します。

必要なコード調整を行った後、必要に応じ、OpenESQL SQLCLRTRANS コンパイラ指令オプションを使用して COBOL アプリケーションおよびすべての COBOL ストアド プロシージャ コードをコンパイルします。

注:複数のストアド プロシージャを呼び出すアプリケーションでは、必要に応じ、各ストアド プロシージャの呼び出しの前にオートコミットをオフにし、各呼び出しの後に再度オンにする必要があります。
COBOL SQL CLR ストアド プロシージャを呼び出す COBOL 以外のアプリケーション
重要:COBOL 以外のアプリケーションから SQL CLR ストアド プロシージャを呼び出すこともできますが、SQLCLRTRANS を使用してコンパイルされた COBOL クライアント用に生成されたコードをエミュレートするようにコードを手動で調整する必要があります。このセクションでは、コード調整の手順について説明します。また、SQLCLRTRANS を使用して COBOL をコンパイルする場合の影響の詳細については、上記の「ソリューション 1 – SQLCLRTRANS」の表を参照してください。

ストアド プロシージャを呼び出す COBOL 以外のアプリケーションの場合、コンパイルする前に、呼び出し元アプリケーション コードに対して次の確認および変更を行います。

コーディング要件
このソリューションで考えられるコーディング要件は、次のとおりです。
オートコミットの状態の確認/変更
COBOL アプリケーションと同様に、このソリューションを使用する場合、オートコミット モード中に COBOL 以外のアプリケーションからストアド プロシージャを呼び出すことはできません。呼び出し元アプリケーション コードを確認し、必要な変更を行い、ストアド プロシージャの呼び出しを実行する前にオートコミット モードをオフにし、COMMIT または ROLLBACK を実行した後に、また複数のストアド プロシージャを呼び出すアプリケーションではセーブポイントも設定した後に、オートコミットをオンに戻すようにします。詳細については、上記の「COBOL SQL CLR ストアド プロシージャを呼び出す COBOL アプリケーション」の「オートコミットの状態の確認/変更」、および下記の「MF__SAVEPOINT の設定」を参照してください。
トランザクションの開始の確認
オートコミットをオフにして呼び出し元アプリケーションがトランザクションを開始するようにします。トランザクションを開始するには、次の TSQL 文を使用します。
  • SET IMPLICIT_TRANSACTIONS ON
  • BEGIN TRANSACTION
ヒント:一部の COBOL 以外のアプリケーションでは、API 呼び出しを使用し、オートコミットをオフにしてトランザクションを開始できる場合があります。
トランザクションのセーブポイントの設定
COBOL 以外のアプリケーションでは、デフォルトの OpenESQL セーブポイントである MF__SAVEPOINT にセーブポイントを設定する必要があります。これを行うには、トランザクションの開始後に TSQL 文SAVE TRANSACTION MF__SAVEPOINTを挿入します。
コミットまたはロールバック
各 COBOL ストアド プロシージャを呼び出した後に、適切な API 呼び出しを実行して、シリアル トランザクション チェーンの作業をコミットまたはロールバックします。
MF_SAVEPOINT の設定
COBOL 以外のアプリケーションで COBOL ストアド プロシージャの呼び出しを複数行う場合は、シリアル トランザクション チェーンの作業をコミットまたはロールバックする呼び出しの後に TSQL 文SAVE TRANSACTION MF__SAVEPOINTを挿入する必要があります。この文により、COBOL ストアド プロシージャの後続の呼び出しによって実行されたトランザクションが適切に処理されるようになります。

必要に応じて、すべての COBOL 以外の呼び出し元アプリケーションをコンパイルします。その後、OpenESQL SQLCLRTRANS コンパイラ指令オプションを使用してすべての COBOL ストアド プロシージャ コードをコンパイルします。

ソリューション 2:入れ子になったストアド プロシージャを使用したストアド プロシージャのシリアル トランザクション チェーン
呼び出し元アプリケーションでシリアル トランザクション チェーンを使用せず、呼び出し先ストアド プロシージャで他のストアド プロシージャを呼び出し、その呼び出し内でシリアル化されたトランザクション チェーンが必要とされる場合は、このソリューションの使用を検討してください。このソリューションでは、先頭の COBOL ストアド プロシージャでアプリケーションのすべてのシリアル トランザクション チェーンを管理します。例として、次の擬似コードについて考えます。
EXEC SQL Call COBOL stored procedure A END-EXEC
     EXEC SQL Insert 1 END-EXEC
     EXEC SQL CALL COBOL stored procedure B END-EXEC
          EXEC SQL Commit END-EXEC
          EXEC SQL Insert 2 END-EXEC
     EXEC SQL Rollback END-EXEC
     EXEC SQL Insert 3 END-EXEC
     EXEC SQL Commit END-EXEC

また、COBOL ルーチンに変換せずに入れ子になったストアド プロシージャを維持するために SQL Server データに対する並行性が重要となるアプリケーションに、このソリューションは最適であることについても説明します。

このソリューションでは、SQLCLRTRANS コンパイラ指令オプションおよび必要に応じて SPCOMMITONRETURN 指令を使用して COBOL コードをコンパイルすると、OpenESQL によって自動的に次のコード調整が行われます。

表 2.ソリューション 2 – SQLCLRTRANS
ON ENTRY EXEC SQL COMMIT EXEC SQL ROLLBACK ON EXIT (戻る)
先頭 (呼び出し先) ストアド プロシージャ

トランザクションの開始

セーブポイントの設定、MF_SAVEPOINT

コミット

MF_SAVEPOINT のリセット

MF_SAVEPOINT までのロールバック

コミット

MF_SAVEPOINT のリセット

MF_SAVEPOINT までのロールバック

または

コミット1

入れ子になったストアド プロシージャ

MF_SAVEPOINT のリセット

MF_SAVEPOINT までのロールバック

呼び出し先 COBOL ルーチン

コミット

MF_SAVEPOINT のリセット

MF_SAVEPOINT までのロールバック

コミット

MF_SAVEPOINT のリセット

1 コンパイル時に SQL(SPCOMMITONRETURN) を指定した場合は、ストアド プロシージャから呼び出し元プログラムに戻るときにコミットが実行されます。SQL(SPCOMMITONRETURN) を指定しなかった場合は、OpenESQL によって設定された最後のセーブポイントまでロールバックが実行されます。
ソリューション 2 の利点と欠点
このソリューションを使用する場合の利点と欠点は、次のとおりです。
利点
  • ストアド プロシージャ コードの変更が必要ない
  • COBOL または COBOL 以外の呼び出し元アプリケーションのコードの変更が最小限で済む
  • 入れ子になったストアド プロシージャがそのまま維持される
  • 先頭のストアド プロシージャによってストアド プロシージャのワークロードがコミットまたはロールバックされるときにロックが解放される
  • データの並行性がソリューション 1 よりも高い
欠点
  • クライアントからの作業をストアド プロシージャでコミットまたはロールバックすることができない
  • ストアド プロシージャからの作業をクライアントでコミットまたはロールバックすることができない
  • 入れ子になったストアド プロシージャによってロックが保持される
  • 整合性がソリューション 1 よりも低い
コーディング要件
このソリューションで考えられるコーディング要件は、SQL CLR COBOL ストアド プロシージャを呼び出すアプリケーションが COBOL で記述されているか別のプログラミング言語で記述されているかによって異なります。
COBOL SQL CLR ストアド プロシージャを呼び出す COBOL アプリケーション
COBOL SQL CLR ストアド プロシージャを呼び出すアプリケーション自体が COBOL である場合は、ストアド プロシージャを呼び出すときにアプリケーションがオートコミット モードであることを確認します。次のいずれかの方法を使用して、オートコミット モードをオンにすることができます。
AUTOCOMMIT 指令を使用してコンパイルする場合
AUTOCOMMIT SQL コンパイラ指令オプションを使用して COBOL コードをコンパイルすると、オートコミット モードが自動的にオンになります。
EXEC SQL SET AUTOCOMMIT ON END-EXEC を COBOL に含める場合
AUTOCOMMIT 指令を使用せずに COBOL コードをコンパイルする場合、SQL CLR COBOL ストアド プロシージャの各呼び出しを実行する前にオートコミット モードをオンにし、各ストアド プロシージャの呼び出しの後にオートコミットをオフにするようにコードを編集する必要があります。
  • オートコミット モードを一時的にオンにするには、ストアド プロシージャの呼び出しの直前にEXEC SQL SET AUTOCOMMIT ON END-EXEC文を挿入します。
  • オートコミット モードを再度オフにするには、ストアド プロシージャ呼び出しの後にEXEC SQL SET AUTOCOMMIT OFF END-EXEC文を挿入します。

必要なコード調整をすべて行った後、OpenESQL SQLCLRTRANS コンパイラ指令オプションおよび必要に応じて SPCOMMITONRETURN 指令を使用して、COBOL アプリケーションおよびすべての COBOL ストアド プロシージャ コードをコンパイルします。

COBOL SQL CLR ストアド プロシージャを呼び出す COBOL 以外のアプリケーション

このソリューションでは、SQL CLR COBOL ストアド プロシージャを呼び出す COBOL 以外のアプリケーションは SQL CLR COBOL ストアド プロシージャの呼び出しを実行する前にオートコミット モードになっている必要があります。これを行うには、呼び出しの前に次の TSQL 文を挿入します。

SET IMPLICIT_TRANSACTIONS ON

呼び出しを実行した後にオートコミット モードをオフにする必要がある場合は、次の TSQL 文を挿入します。

SET IMPLICIT_TRANSACTIONS OFF

コードで SQL CLR COBOL ストアド プロシージャの呼び出しを複数実行する場合は、各呼び出しを実行する前にオートコミット モードをオンにする必要があります。

ヒント:一部の COBOL 以外のアプリケーションでは、API 呼び出しを使用して、オートコミット モードのオンとオフを切り替えることができる場合があります。

必要なコード調整をすべて行った後、OpenESQL SQLCLRTRANS コンパイラ指令オプションおよび必要に応じて SPCOMMITONRETURN 指令を使用して、アプリケーションおよびすべての COBOL ストアド プロシージャ コードをコンパイルします。

ソリューション 3:呼び出し先 COBOL ルーチンを使用したストアド プロシージャのシリアル トランザクション チェーン
呼び出し元アプリケーションでシリアル トランザクション チェーンを使用せず、呼び出し先ストアド プロシージャで COBOL ルーチンを呼び出し、その呼び出し内でシリアル化されたトランザクション チェーンが必要とされる場合は、このソリューションの使用を検討してください。例として、次の擬似コードについて考えます。
EXEC SQL Call COBOL stored procedure A END-EXEC
     EXEC SQL Insert 1 END-EXEC
     CALL COBOL routine B END-EXEC
          EXEC SQL Commit END-EXEC
          EXEC SQL Insert 2 END-EXEC
     EXEC SQL Rollback END-EXEC
     EXEC SQL Insert 3 END-EXEC
     EXEC SQL Commit END-EXEC

また、SQL Server データに対する並行性が最も重要となるアプリケーションにこのソリューションは最適であること、および先頭の COBOL ストアド プロシージャでアプリケーションのすべてのシリアル トランザクション チェーンを管理できることについても説明します。

このソリューションでは、SQLCLRTRANS コンパイラ指令オプションおよび必要に応じて SPCOMMITONRETURN 指令を使用して COBOL コードをコンパイルすると、OpenESQL によって自動的に次のコード調整が行われます。

表 3.ソリューション 3 – SQLCLRTRANS
ON ENTRY EXEC SQL COMMIT EXEC SQL ROLLBACK ON EXIT (戻る)
先頭 (呼び出し先) ストアド プロシージャ

トランザクションの開始

セーブポイントの設定、MF_SAVEPOINT

コミット

MF_SAVEPOINT のリセット

MF_SAVEPOINT までのロールバック

コミット

MF_SAVEPOINT のリセット

MF_SAVEPOINT までのロールバック

または

コミット1

入れ子になったストアド プロシージャ

MF_SAVEPOINT のリセット

MF_SAVEPOINT までのロールバック

呼び出し先 COBOL ルーチン

コミット

MF_SAVEPOINT のリセット

MF_SAVEPOINT までのロールバック

コミット

MF_SAVEPOINT のリセット

1 コンパイル時に SQL(SPCOMMITONRETURN) を指定した場合は、ストアド プロシージャから呼び出し元プログラムに戻るときにコミットが実行されます。SQL(SPCOMMITONRETURN) を指定しなかった場合は、OpenESQL によって設定された最後のセーブポイントまでロールバックが実行されます。
ソリューション 3 の利点と欠点
このソリューションを使用する場合の利点と欠点は、次のとおりです。
利点
  • ストアド プロシージャ コードの変更が必要ない
  • SPCALLLOCAL HCOSS コンパイラ指令オプションを使用してコンパイルできる場合は COBOL 呼び出し元アプリケーションのコードの変更が最小限で済む
  • COBOL 以外の呼び出し元アプリケーションのコードの変更が最小限で済む
  • 先頭のストアド プロシージャおよび呼び出し先 COBOL ルーチンによってコミットまたはロールバックが行われるときにロックが解放される
  • SQL Server とのデータの並行性がソリューション 1 およびソリューション 2 よりも高い
欠点
  • クライアントからの作業をストアド プロシージャでコミットまたはロールバックすることができない
  • ストアド プロシージャからの作業をクライアントでコミットまたはロールバックすることができない
  • HCOSS SPCALLLOCAL 指令を使用してコンパイルする場合を除き、入れ子になった COBOL ストアド プロシージャを COBOL ルーチンに変換する必要がある
  • カレンシーがソリューション 1 およびソリューション 2 よりも高い
  • 整合性がソリューション 1 よりも低い
コーディング要件
このソリューションで考えられるコーディング要件は、SQL CLR COBOL ストアド プロシージャを呼び出すアプリケーションが COBOL で記述されているか別のプログラミング言語で記述されているかによって異なります。
COBOL SQL CLR ストアド プロシージャを呼び出す COBOL アプリケーション
COBOL SQL CLR ストアド プロシージャを呼び出すアプリケーション自体が COBOL である場合は、ストアド プロシージャを呼び出すときにアプリケーションがオートコミット モードであることを確認します。次のいずれかの方法を使用して、オートコミット モードをオンにすることができます。
AUTOCOMMIT 指令を使用してコンパイルする場合
AUTOCOMMIT SQL コンパイラ指令オプションを使用して COBOL コードをコンパイルすると、オートコミット モードが自動的にオンになります。
EXEC SQL SET AUTOCOMMIT ON END-EXEC を COBOL に含める場合
AUTOCOMMIT 指令を使用せずに COBOL コードをコンパイルする場合、SQL CLR COBOL ストアド プロシージャの各呼び出しを実行する前にオートコミット モードをオンにし、各ストアド プロシージャの呼び出しの後にオートコミットをオフにするようにコードを編集する必要があります。
  • オートコミット モードを一時的にオンにするには、ストアド プロシージャの呼び出しの直前にEXEC SQL SET AUTOCOMMIT ON END-EXEC文を挿入します。
  • オートコミット モードを再度オフにするには、ストアド プロシージャ呼び出しの後にEXEC SQL SET AUTOCOMMIT OFF END-EXEC文を挿入します。

必要なコード調整をすべて行った後、OpenESQL SQLCLRTRANS コンパイラ指令オプションおよび必要に応じて SPCOMMITONRETURN 指令を使用して、COBOL アプリケーションおよびすべての COBOL ストアド プロシージャ コードをコンパイルします。これにより、ストアド プロシージャから呼び出し元アプリケーションに戻るときに、ストアド プロシージャによって実行された作業が自動的にコミットされます。SPCOMMITONRETURN を指定しなかった場合は、ストアド プロシージャの代わりに、OpenESQL によって、実行された最後のコミットまでロールバックされます。

COBOL SQL CLR ストアド プロシージャを呼び出す COBOL 以外のアプリケーション
このソリューションでは、SQL CLR COBOL ストアド プロシージャを呼び出す COBOL 以外のアプリケーションは SQL CLR COBOL ストアド プロシージャの呼び出しを実行する前にオートコミット モードになっている必要があります。これを行うには、各呼び出しの前に次の TSQL 文を挿入します。
SET IMPLICIT_TRANSACTIONS ON

呼び出しを実行した後にオートコミット モードをオフにする必要がある場合は、次の TSQL 文を挿入します。

SET IMPLICIT_TRANSACTIONS OFF

コードで SQL CLR COBOL ストアド プロシージャの呼び出しを複数実行する場合は、各呼び出しを実行する前にオートコミット モードをオンにする必要があります。

必要なコード調整をすべて行った後、OpenESQL SQLCLRTRANS コンパイラ指令オプションおよび必要に応じて SPCOMMITONRETURN 指令を使用して、すべての COBOL ストアド プロシージャ コードをコンパイルします。SPCOMMITONRETURN を指定すると、ストアド プロシージャから呼び出し元アプリケーションに戻るときに、ストアド プロシージャによって実行された作業が自動的にコミットされます。SPCOMMITONRETURN を指定しなかった場合は、ストアド プロシージャの代わりに、OpenESQL によって、実行された最後のコミットまでロールバックされます。

また、EXEC SQL CALL ストアド プロシージャの A 文を受け取って標準の COBOL CALL A に変換する HCOSS SPCALLLOCAL 指令を、必要に応じて使用することもできます。これにより、ソリューション 3 への移行が容易になります。