このセクションでは、OceanBaseデータベースにおけるエラーコードの構成と意味について説明します。
JavaまたはCのドライバライブラリを使用してOceanBaseデータベースに接続する場合、SQLステートメントの実行が失敗すると、実行失敗を示すエラーが返されます。エラーには通常、以下の3つの情報が含まれます:
32ビット整数で表されるエラーコード
5文字で構成される文字列、すなわちSQLSTATE
人が読めるエラーメッセージを含む文字列
例えば、クライアントOBClientを使用してOceanBaseデータベースに接続した後、SQLステートメントの実行が失敗すると、システムは端末に以下のようなエラー情報を出力します:
ERROR 1054 (42S22): Unknown column ‘haha’ in ‘field list’
ここで、1054 がエラーコード、括弧内の 42S22 がSQLSTATE、コロンの後が具体的なエラーメッセージです。
互換性設計の原則により、同じエラーに対して、MySQLモード(sys テナントはMySQLモードに属します)とOracleモードでは異なるエラーコードが返される場合があります。例えば、OceanBaseの内部エラーコード -5217 は、SQLステートメントで存在しない列名が参照されたことを示します。このエラーは、2つのテナントモードで以下のように表現されます。
テナントモード |
エラーコード |
SQLSTATE |
エラーメッセージ |
|---|---|---|---|
| MySQL | 1054 | 42S22 | Unknown column |
| Oracle | 904、すなわち OBE-00904 | 42S22 | invalid identifier |
エラーコード解析ツールob_errorを使用すると、エラーコードの意味や内部・外部エラーコードのマッピング関係を確認できます。エラーコード解析ツールob_errorの詳細については、ob_errorを参照してください。
SQLSTATE
SQLSTATEはSQL標準で定義されたエラーコードであり、5つの数字または大文字のラテン文字からなる文字列値です。最初の2文字は大まかなエラーカテゴリを、後の3文字はより具体的なエラー原因を示します。例えば、00 は成功、01 は警告、02 は未検出、22 はデータエラー、42 は構文エラーなどを表します。そのため、同じエラーに対して、OceanBaseデータベースはMySQLモードとOracleモードで同じSQLSTATEを返します。
理論上、すべてのSQL標準に準拠するデータベースは一貫したSQLSTATEを返すため、アプリケーションのエラー処理ロジックは異なるデータベース間で互換性を持たせることができます。
エラーコード
SQLSTATEという標準のエラーコードが存在しますが、標準の進化はデータベースベンダーの実践に遅れがちであるため、各ベンダーはより詳細なエラー原因を識別するために独自のエラーコード(ベンダーコード)を定義することが一般的です。また、各ベンダーが独自に定義したエラーコードは、異なるデータベース間で互換性がありません。
OceanBaseデータベースでは、非互換のカスタムエラーコードに対応するSQLSTATEは、一般的に HY000 です。
エラーメッセージ
エラーメッセージは人間が理解しやすい形でのヒント情報を提供します。エラーメッセージはバージョンの更新に伴って変更される可能性があり、同じエラーでも言語環境の設定によって現地語で異なるメッセージが表示される場合があるため、一般的にアプリケーションではエラーメッセージではなく、エラーコードまたはSQLSTATEに基づいてエラー処理を行うべきです。