SQLSTATE はデータベース状態関数で、5 文字の CHARACTER データ・タイプを戻します。デフォルト値は '00000' (ストリングとしての 5 つのゼロ) です。
メッセージ・フロー内で、外部データベース・リソースにアクセスしたり、これを更新することができます。これは、Filter、Database、および Compute ノードで使用可能な ESQL データベース関数を使用して行います。外部データベースに呼び出しを行うと、表が存在しない、データベースが利用不能である、すでに存在するキーの挿入などのエラーが生じる可能性があります。
これらのエラーが発生したら、ブローカーのデフォルトのアクションは、例外を生成することです。この動作は、プロパティー「データベース・エラーで例外をスローする」の設定の仕方によって決まります。このチェック・ボックスを選択する場合、ブローカーはノードの処理を停止し、メッセージをノードの障害端末に伝搬し、エラーの詳細を ExceptionList に記録します。デフォルトの動作をオーバーライドし、データベース・エラーをノードの ESQL で処理する場合、「データベース・エラーで例外をスローする」チェック・ボックスのチェックを外します。つまり、ブローカーは例外をスローしないので、特定の SQL 状態コードが期待されていない場合、THROW ステートメントを組み込んで例外をスローする必要があります。THROW の説明については、THROW ステートメントを参照してください。
ノードでデータベース・エラーを処理するよう選択した場合、データベース状態関数 SQLSTATE を使用して、ESQL で行われた DBMS 呼び出しの状況についての情報を受け取ることができます。この関数を現行ノードの ESQL の条件ステートメントに組み込んで、生じる可能性のあるエラーを認識して処理できます。
SQL 状態
ESQL では、SQL 状態は可変長の文字ストリングです。規則により、SQL 状態は 6 文字の長さで、文字 0 から 9 まで、および A から Z までのみが含まれます。6 文字の意義は以下のとおりです。
- 文字 1
- 例外の発生元。
- 文字 2、3
- 例外のクラス。
- 文字 4 から 6
- 例外のサブクラス。
例外の SQL 状態は、2 段階のプロセスによって判別されます。最初の段階では、例外情報が調べられ、元のエラーについて記述した例外が見つかるまで、ラッピング例外 (つまり、例外が起きた時点のブローカーの実行内容に関する情報) がステップオーバーされます。
2 番目の段階は以下のとおりです。
- データベース例外を選択した場合は、SQL 状態はデータベースによって提供される状態になります。ただし文字 "D" を前に付けて、ブローカーで起きた例外と混同しないようにします。SQL コード、ネイティブ・エラー、およびエラー・テキストは、データベースによって提供されるものになります。
- ユーザー例外を選択した (つまり、THROW ステートメントを起点にする) 場合は、SQL コード、状態、ネイティブ・エラー、およびエラー・テキストは、例外の挿入項目のうち最初の 4 つが順番に採用されます。結果の状態値は、現状のまま採用されます ("U" などの文字が前に付けられません)。実際に、文字 "U" はブローカーで発生元の標識として使用されません。既存の SQL 状態をまねるのではなく固有の SQL 状態を定義する場合は、先頭が文字 "U" の SQL 状態を使用してください。そうすれば、ハンドラーは LIKE’U%’演算子を使用して、ユーザー定義例外とユーザーがスローした例外をすべて突き合わせることができます。
- メッセージ・トランスポートまたは ESQL のインプリメンテーション自体が発生元の例外を選択した場合は、SQL コード、状態、ネイティブ・エラー、およびエラー・テキストは、以下のリストに記述されているものになります。
- 他のすべての例外の場合は、SQL 状態は '' になり、これは発生元、クラス、およびサブクラスがないことを示します。
現在空の SQL 状態になっている例外の中には、将来のリリースで個別の状態が提供されるものもあります。分類されていない例外をキャッチする場合は、有効範囲の最後のハンドラー上で、SQL 状態に「すべて」を意味するワイルドカード (%) を使用してください。この場合、以前に分類されていなかった例外に新しい SQL 状態が提供されても、引き続き同じ例外の集合がキャッチされます。
以下の SQL 状態が定義済みです。
- Dddddd
- ddddd は、データベースによって戻される状態です。
- SqlState = ‘S22003'
- 算術オーバーフロー。結果が数値タイプになり、値がサポートされている範囲を超える操作。
- SqlState = ‘S22004’
- ヌル値を使用できません。ヌル値を使用できない場所にヌル値がありました。
- SqlState = ‘S22007’
- 無効な日時形式。文字から日時タイプへのキャストに使用される文字ストリングの、基本形式が誤っている ('01947-10-24' など) か、値がグレゴリオ暦で使用できる範囲外である ('1947-21-24' など) のどちらかです。
- SqlState = ‘S22008’
- 日時フィールドのオーバーフロー。結果が日時タイプになり、値がサポートされている範囲を超える操作。
- SqlState = ‘S22011’
- SUBSTRING エラー。FROM および FOR パラメーターの場合、第 1 オペランドの長さと合わせると、SUBSTRING 関数の規則に違反します。
- SqlState = ‘S22012’
- ゼロ除算。結果のデータ・タイプに無限大の概念がない除算操作に、ゼロの右オペランドがあります。
- SqlState = ‘S22015’
- インターバル・フィールドのオーバーフロー。結果が INTERVAL タイプになり、値が INTERVAL データ・タイプでサポートされている範囲を超える操作。
- SqlState = ‘S22018’
- キャストの無効文字値。
- SqlState = ‘SPS001’
- 無効なターゲット・ターミナル。ターミナル・ステートメントに対する PROPAGATE が、無効なターミナル名を使用しようとしました。
- SqlState = ‘SPS002’
- 無効なターゲット・ラベル。ラベル・ステートメントに対する PROPAGATE が、無効なラベルを使用しようとしました。
- SqlState = 'MQW001'、SqlNativeError = 0
- ビット・ストリームが MQ メッセージの要件と合致しません。キューへの書き込みは試行されませんでした。この問題の解決法として、再試行やキュー管理を行っても成功しません。
- SqlState = 'MQW002'、SqlNativeError = 0
- ターゲットのキュー名またはキュー・マネージャー名が無効でした (つまり、ユニコードからキュー・マネージャーのコード・ページに変換できませんでした)。この問題の解決法として、再試行したりキューを空にしたりしても成功しません。
- SqlState = 'MQW003'、SqlNativeError = 0
- 要求モードが指定されましたが、"reply to" キュー名またはキュー・マネージャー名が無効でした (つまり、ユニコードからマネージャーのコード・ページに変換できませんでした)。この問題の解決法として、再試行したりキューを空にしたりしても成功しません。
- SqlState = 'MQW004'、SqlNativeError = 0
- 応答モードが指定されましたが、メッセージから取られたキュー名またはキュー・マネージャー名が無効でした (つまり、指定されたコード・ページからユニコードに変換できませんでした)。この問題の解決法として、再試行したりキューを空にしたりしても成功しません。
- SqlState = 'MQW005'、SqlNativeError = 0
- 宛先リスト・モードが指定されましたが、指定された宛先リストが、宛先リストの基本要件に合致していません。キューへのメッセージの書き込みは試行されませんでした。この問題の解決法として、再試行やキュー管理を行っても成功しません。
- SqlState = 'MQW101', SqlNativeError = As returned by MQ
- ターゲットのキュー・マネージャーまたはキューを開くことができませんでした。この問題の解決法として、キュー管理を行うと成功する可能性がありますが、再試行は成功しません。
- SqlState = 'MQW102', SqlNativeError = as returned by MQ
- ターゲットのキュー・マネージャーまたはキューに書き込めませんでした。この問題の解決法として、再試行やキュー管理を行うと成功する可能性があります。
- SqlState = 'MQW201'、SqlNativeError = エラーのある宛先の数
- 宛先リストの処理中に複数のエラーが起きました。メッセージがゼロ個以上のキューに書き込まれた可能性があります。この問題の解決法として、再試行やキュー管理を行うと成功する可能性があります。
- ユーザーが THROW ステートメント中で使用している例外
- 上記のいずれかの例外をまねるのではない場合は、ユーザー例外に Uuuuuuu を使用してください。
- 空ストリング
- 他のすべてのエラー。