この記事では、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 10を使用することで、エラーコードの意味や内部および外部エラーコードのマッピング関係をクエリできます。エラーコード解析ツールob_errorの詳細については、ob_errorを参照してください。
SQLSTATE
SQLSTATEはSQL標準で定義されたエラーコードであり、5つの数字または大文字のラテン文字で構成される文字列値です。この5つの数字の最初の2桁は大きなエラーのカテゴリを示し、後の3桁はより具体的なエラーの原因を示します。例えば、00 は成功を示し、01 は警告を示し、02 は未発見を示し、22 はデータ関連のエラーを示し、42 は構文エラーを示します。したがって、同じエラーに対して、OceanBaseデータベースはMySQLモードとOracleモードで同じSQLSTATEを返します。
理論的には、すべてのSQL標準に従うデータベースは一貫したSQLSTATEを返すため、アプリケーションのエラー処理ロジックは異なるデータベースに対応できます。
エラーコード
SQLSTATEというSQL標準で定められたエラーコードは既に存在していますが、標準の発展は常にデータベースベンダーの実践に遅れがちであり、各ベンダーはより詳細なエラー原因を識別するために独自のエラーコード(vendor code)を定義する必要があることがよくあります。そして、各メーカーが独自に定義したエラーコードは、異なるデータベース間で互換性がありません。
OceanBaseデータベースでは、非互換のカスタムエラーコードに対応するSQLSTATEは一般に HY000 です。
エラーメッセージ
エラーメッセージは人間に優しいヒント情報を提供し、人間にだけ優しいです。エラーメッセージはバージョンの進化に伴って変化する可能性があり、同じエラーが異なる言語環境の設定で異なるローカライズされたエラーメッセージを表示する可能性があるため、一般的にはアプリケーション内でエラー処理はエラーコードまたはSQLSTATEに基づくべきであり、エラーメッセージに基づくべきではありません。