SQL エラー マッピング機能を使用すると、アプリケーションで SQLCODE、SQLSTATE、SQLERR、および MFSQLMESSAGETEXT フィールドにエラー情報を返す方法をカスタマイズできます。これは、OpenESQL とデータベースの両方から通常返される値を、指定した値に置き換えることによって行われます。この機能は、異なるデータベース間でアプリケーションを移行する場合や、エラー状態および警告状態に関する特定の値を受け取ることにアプリケーション
ロジックが依存している場合に役立ちます。
注: SQL エラー マッピング機能は、RETURNED_SQLCODE、RETURNED_SQLSTATE、および MESSAGE_TEXT のデータを使用して、GET DIAGNOSTICS 文にも適用されます。
特定のデータベース用に設計されたロジックを含むアプリケーションでエラー コード ロジックを変更するのは、手間がかかる場合があります。次のシナリオを考えてみます。
- 現在のコードでは、結果セットの処理の最後に Oracle SQLCODE 1403 を想定しており、他のデータベースによって生成された SQLCODE 100 は想定していない。
- 現在のコードでは、SELECT INTO が複数の行を返す場合、z/OS DB2 SQLCODE -811 を想定している。
- 現在のコードでは、FETCH 文の後にデータ切り捨ての警告を想定していないが、新しいデータベースは SQLCODE 1 を設定する。
- 重複キー エラーを発生させる行の挿入時、現在のコードでは、元のデータベースのエラー コードを想定している。
これらは単純な例のごく一部ですが、エラー コード マッピングを使用すると、アプリケーション コードで現在のエラー処理を維持するための柔軟性を最大限に得られます。エラー状況で新しいデータベースが返す内容に基づいて検索条件を指定し (SQLCODE
または SQLSTATE の戻り値が重要でない場合は値 0 を使用)、元のデータベースのエラー値を指定すると、アプリケーションが想定しているエラー コードを確実に受け取ることができます。
エラー マッピングは、有効になっている場合、埋め込み SQL 文の実行が完了した後に処理されます。SQLCODE がゼロ以外であるか、SQLSTATE が '00000' でない場合、エラー マップを使用して、SQLCODE、SQLSTATE、およびオプションで関連するエラー メッセージをエラー マップの値に置き換えるかどうかが決定されます。これは、次の条件のいずれかが満たされるまで、エラー マップ レコードを順番にスキャンすることによって行われます。
- マップの最後に到達する。この場合、SQLCODE、SQLSTATE、およびエラー メッセージは変更されません。
- SQLCODE、SQLSTATE、およびエラー メッセージに存在するサブストリングの組み合わせで、一致がある。
SQL エラー マッピング ファイル
エラー マッピングは、エラー マッピング ファイルを使用して制御します。これは、マップするエラー状態、SQLCODE と SQLSTATE の置換値、およびオプションでエラー メッセージの置換値 (エラー メッセージの完全な抑制を含む) を指定する単純なテキスト
ファイルです。SQLCODE の戻り値、SQLSTATE の戻り値、または返されたエラー メッセージ内のサブストリング、あるいはこれらの任意の組み合わせに基づいて、マッピングを指定できます。
- 場所
- マッピング ファイルのデフォルトの場所は次のとおりです。 %ProgramData%\Micro Focus\sqlcodes
注: MF_ERRORMAP_PATH システム環境変数を使用して、デフォルトの場所をオーバーライドできます。
- ファイル名
- 任意のプレフィックスを使用して、SQL エラー マッピング ファイルの名前を指定できます。ただし、すべてのエラー マッピング ファイルは拡張子が .emap である必要があります。
- 内容
- マッピング ファイルの各レコードには、カンマで区切られた次の値がこの順序で含まれます。
{SC-ret-val|0},{SS-ret-val|0},[msg-substr],SC-repl-val,SS-repl-val,[msg-substr-repl-val]
詳細は次のとおりです。
- SC-ret-val|0
- データベースからの SQLCODE の戻り値。SQLCODE の戻り値を置換条件として使用しない場合は 0 (ゼロ)。
- SS-ret-val|0
- データベースからの SQLSTATE の戻り値。SQLSTATE の戻り値を置換条件として使用しない場合は 00000 (すべてゼロ)。
- msg-substr
- データベースから返されるエラー メッセージに含まれる文字列を指定します (該当する場合)。このサブストリングがエラー メッセージ内に存在する場合に、SQLCODE および SQLSTATE の条件も満たされていると、エラーがマップされます。サブストリングの指定では、次の構文規則が適用されます。
- サブストリングにカンマが含まれている場合は、サブストリング全体を一重引用符 (') または二重引用符 (') で囲みます。
- メッセージのサブストリングでは大文字と小文字が区別されます。
注: サブストリングの検索では、SQLERRMC で返される 70 バイトのサブセットではなく、エラー メッセージ全体が使用されます。
サブストリングを指定する以外に、次のような 2 つのオプションもあります。
- 次のカンマ区切り文字の前にスペースを含めて、値を省略する。この場合、元のメッセージが返されるため、実質的にサブストリングのエラー メッセージ置換がオフになります。
- 1 つのチルダ (~) 文字を指定する。この場合、SQLERRMC、MFSQLMESSAGETEXT (または GET DIAGNOSTICS での MESSAGE_TEXT のホスト変数) で構成されるメッセージ受信フィールドにスペースが入力されます。SQLCA
の SQLERRML も、SQLERRMC で返される文字数ではなくゼロに設定されます。
- SC-repl-val
- 元のデータベースの SQLCODE の置換値。
- SS-repl-val
- 元のデータベースの SQLSTATE の置換値。
- msg-substr-repl-val
- エラー メッセージの置換値 (該当する場合)。msg-substr の構文規則は、msg-substr-repl-val にも適用されます。省略した場合、元のエラー メッセージは置き換えられません。メッセージを完全に抑制するには、1 つのチルダ (~) 文字を指定します。
- SQL エラー マッピング レコードの例
-
- 例 1
- この例は、DB/2 for z/OS から PostgreSQL への移行に基づいています。このマッピング ファイル レコードでは、シングルトン SELECT が 1 から -811 の行を複数返す場合に返される SQLCODE を変更しますが、エラー
メッセージはそのままにします。一致は、SQLCODE および SQLSTATE に基づきます。
1, 21000, ,-811, 21000
- 例 2
- この例は、DB/2 for z/OS から PostgreSQL への移行に基づいています。このレコードでは、主キーまたは一意制約のエラーが発生した場合に文字列「duplicate」を含むエラーをマップし、エラー メッセージを「Unique constraint
violation」に変更します。SQLCODE についても SQLSTATE についても PostgreSQL が提供する戻り値は重要でないことに注意してください。検索条件は、返された PostgreSQL エラー メッセージのみに基づいています。
0, 00000,"duplicate", -803, 22002, Unique constraint violation
- 例 3
- ODBC では、ホスト変数が戻り値より小さい場合、警告を生成します。アプリケーションで SQLCODE が負ではなくゼロ以外であることを検証すると、予想とは異なる結果が生じる場合があります。エラー メッセージを含め、警告状態を完全に抑制するには、次のレコードを定義して、SQLSTATE の値が 01004 である警告を従来同様に 00000 を戻すようにします。
0, 01004, , 0, 00000, ~
- 例 4
- 例 3 に代わる方法として、UTF-8 を使用する環境へのレガシー アプリケーションの移行時、ホスト変数が十分に大きいかどうかをテストする場合に、次のレコードはこの警告を SQLCODE -55 および SQLSTATE "22XYZ" のエラーに変更します。
0, 01004, , -55, 22XYZ, Host variable too small
SQL エラー マッピングの有効化
エラー マッピングを有効にするには、ERRORMAP SQL コンパイラ指令オプションを使用します。詳細については、「ERRORMAP」を参照してください。
1 つのプログラムで複数のエラー マッピング ファイルを使用する場合、詳細については、「SET ERRORMAP」リファレンス トピックを参照してください。