SQLSTATEとSQLCODEはエラーコードを提供する異なる2つの機構です。 共に標準SQLから派生されたものですが、SQLCODEはSQL-92版では廃れたものとされ、以降の版から削除されました。 したがって、新規アプリケーションではSQLSTATEを使用することを強く勧めます。
SQLSTATEは5要素の文字配列です。 この5文字は、各種のエラー条件、警告条件のコードを表現する数字、大文字から構成されます。 SQLSTATEは階層を持った機構です。 最初の2文字は条件を汎化したクラスを示し、残り3文字は汎化クラスの副クラスを示します。 成功状態は00000というコードで示されます。 SQLSTATEコードのほとんどは標準SQLで定義されています。 PostgreSQLサーバは本質的にSQLSTATEエラーコードをサポートしています。 したがって、すべてのアプリケーションでこのエラーコードを使用することで、高度な一貫性を達成することができます。
参照
詳細については“PostgreSQL文書”の“付録”の“PostgreSQLエラーコード”を参照してください。
廃止されたエラーコードの機構であるSQLCODEは単なる整数です。 0という値は成功を意味し、正の値は追加情報を持った成功を、負の値はエラーを示します。 標準SQLでは、直前のコマンドが0行を返す、もしくは0行に影響したことを示す+100という正の値のみを定義しています。 負の値は規定されていません。 したがって、この機構では低い移植性しか達成できず、また、コード体系も階層を持っていません。 歴史的に、PostgreSQLの埋め込みSQLプロセッサには、いくつかの特殊なSQLCODEの値が専用に割り当てられていました。 以下に、その数値とそのシンボル名の一覧を示します。 これらは他のSQL実装への移植性がないことを忘れないでください。 アプリケーションのSQLSTATE機構への移行を簡易化するために、対応するSQLSTATEも示しています。 しかし、2つのしくみの間の関係は1対1ではなく1対多です (実際は多対多です)。 ですので、場合ごとにグローバルな各SQLSTATEを参照しなければなりません。
参照
“PostgreSQL文書”の“付録”の“PostgreSQL エラーコード”を参照してください。
以下は割り当て済みのSQLCODEです。
エラーがないことを示す。(SQLSTATE 00000)
これは、最後に実行したコマンドが取り出した、または、処理した行がゼロ行であったこと、あるいは、カーソルの最後であることを示す、害のない条件です。(SQLSTATE 02000)
以下のように、カーソルをループ内で処理する時、ループを中断する時を検知する方法として、このコードを使用することができます。
PERFORM NO LIMIT EXEC SQL FETCH ... END-EXEC IF SQLCODE = 100 THEN GO TO FETCH-END END-IF END-PERFORM.
しかし、WHENEVER NOT FOUND GOTO…はこれを内部で効率的に行います。 このため、通常、外部で明示的に記述する利点はありません。
仮想メモリ不足を示します。 この数値は-ENOMEMとして定義します。 (SQLSTATE YE001)
ライブラリが把握していない何かをプリプロセッサが生成したことを示します。 おそらく、互換性がないプリプロセッサとライブラリのバージョンを使用しています。 (SQLSTATE YE002)
コマンドの想定より多くのホスト変数が指定されたことを意味します。 (SQLSTATE 07001もしくは07002)
コマンドの想定よりも少ないホスト変数が指定されたことを意味します。 (SQLSTATE 07001もしくは07002)
問い合わせが複数行を返したけれども、SQL文では1つの結果の格納の準備だけしかしていなかったことを意味します (例えば、指定された変数が配列ではなかった)。 (SQLSTATE 21000)
ホスト変数の型が符号あり整数ですが、データベース内のデータ型が異なり、その値を符号あり整数として解釈させることができませんでした。 ライブラリはこの変換にstrtol()を使用します。 (SQLSTATE 42804)
ホスト変数の型が符号なし整数ですが、データベース内のデータ型が異なり、その値を符号なし整数として解釈させることができませんでした。 ライブラリはこの変換にstrtoul()を使用します。 (SQLSTATE 42804)
ホスト変数の型が浮動小数点型ですが、データベース内のデータ型が異なり、その値を 浮動小数点型として解釈させることができませんでした。 ライブラリはこの変換にstrtod()を使用します。 (SQLSTATE 42804)
ホスト変数の型がDECIMALかDISPLAYですが、データベース内のデータ型が異なり、その値をDECIMALとして解釈させることができませんでした。DISPLAYの場合、データベース内の値が大きすぎて、値を変換できない場合に、このエラーが起こります。 (SQLSTATE 42804)
ホスト変数の型がINTERVALであり、データベース内のデータが他の型であり、INTERVAL値として解釈することができない値を含みます。 (SQLSTATE 42804)
ホスト変数の型がDATEであり、データベース内のデータが他の型であり、DATE値として解釈することができない値を含みます。 (SQLSTATE 42804)
ホスト変数の型がTIMESTAMPであり、データベース内のデータが他の型であり、TIMESTAMP値として解釈することができない値を含みます。 (SQLSTATE 42804)
これは、ホスト変数の型がBOOLですが、データベース内のデータが't'でも'f'でもなかったことを意味します。 (SQLSTATE 42804)
PostgreSQLサーバに送信されたSQL文が空でした (通常埋め込みSQLプログラムでは発生しません。ですので、これは内部エラーを示しているかもしれません)。 (SQLSTATE YE002)
NULL値が返されましたが、NULL用の指示子変数が与えられていませんでした。 (SQLSTATE 22002)
配列が必要な箇所に普通の変数が使用されていました。 (SQLSTATE 42804)
配列値が必要な箇所にデータベースが普通の変数を返しました。 (SQLSTATE 42804)
存在しない接続にプログラムがアクセスしようとしました。 (SQLSTATE 08003)
存在するが開いていない接続にプログラムがアクセスしようとしました (これは内部エラーです)。 (SQLSTATE YE002)
使用しようとしたSQL文がプリペアされていませんでした。 (SQLSTATE 26000)
指定した記述子が見つかりませんでした。 使用しようとしたSQL文はプリペアされていませんでした。 (SQLSTATE 33000)
記述子のインデックスが範囲外でした。 (SQLSTATE 07009)
無効な記述子項目が要求されました。(これは内部エラーです。) (SQLSTATE YE002)
動的なSQL文の実行時にデータベースが数値を返しましたが、ホスト変数が数値でありませんでした。 (SQLSTATE 07006)
動的なSQL文の実行時にデータベースが数値以外を返しましたが、ホスト変数が数値でした。 (SQLSTATE 07006)
PostgreSQLサーバで何らかのエラーが発生しました。 このメッセージはPostgreSQLサーバからのエラーメッセージを含みます。
PostgreSQLサーバがトランザクションのコミットやロールバックを始めることができないことを通知しました。 (SQLSTATE 08007)
データベースへの接続試行に失敗しました。 (SQLSTATE 08001)
重複キーエラー。一意性制約違反。 (SQLSTATE 23505)
副問い合わせの結果が単一行ではありません。 (SQLSTATE 21000)
無効なカーソル名が指定されました。 (SQLSTATE 34000)
トランザクションが進行中です。 (SQLSTATE 25001)
活動中(進行中)のトランザクションがありません。 (SQLSTATE 25P01)
既存のカーソル名が指定されました。 (SQLSTATE 42P03)