ページの先頭行へ戻る
Enterprise Postgres 10 アプリケーション開発ガイド
FUJITSU Software

D.7.3 SQLSTATE対SQLCODE

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です。

0

エラーがないことを示す。(SQLSTATE 00000)

100

これは、最後に実行したコマンドが取り出した、または、処理した行がゼロ行であったこと、あるいは、カーソルの最後であることを示す、害のない条件です。(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…はこれを内部で効率的に行います。 このため、通常、外部で明示的に記述する利点はありません。

-12

仮想メモリ不足を示します。 この数値は-ENOMEMとして定義します。 (SQLSTATE YE001)

-200

ライブラリが把握していない何かをプリプロセッサが生成したことを示します。 おそらく、互換性がないプリプロセッサとライブラリのバージョンを使用しています。 (SQLSTATE YE002)

-201

コマンドの想定より多くのホスト変数が指定されたことを意味します。 (SQLSTATE 07001もしくは07002)

-202

コマンドの想定よりも少ないホスト変数が指定されたことを意味します。 (SQLSTATE 07001もしくは07002)

-203

問い合わせが複数行を返したけれども、SQL文では1つの結果の格納の準備だけしかしていなかったことを意味します (例えば、指定された変数が配列ではなかった)。 (SQLSTATE 21000)

-204

ホスト変数の型が符号あり整数ですが、データベース内のデータ型が異なり、その値を符号あり整数として解釈させることができませんでした。 ライブラリはこの変換にstrtol()を使用します。 (SQLSTATE 42804)

-205

ホスト変数の型が符号なし整数ですが、データベース内のデータ型が異なり、その値を符号なし整数として解釈させることができませんでした。 ライブラリはこの変換にstrtoul()を使用します。 (SQLSTATE 42804)

-206

ホスト変数の型が浮動小数点型ですが、データベース内のデータ型が異なり、その値を 浮動小数点型として解釈させることができませんでした。 ライブラリはこの変換にstrtod()を使用します。 (SQLSTATE 42804)

-207

ホスト変数の型がDECIMALかDISPLAYですが、データベース内のデータ型が異なり、その値をDECIMALとして解釈させることができませんでした。DISPLAYの場合、データベース内の値が大きすぎて、値を変換できない場合に、このエラーが起こります。 (SQLSTATE 42804)

-208

ホスト変数の型がINTERVALであり、データベース内のデータが他の型であり、INTERVAL値として解釈することができない値を含みます。 (SQLSTATE 42804)

-209

ホスト変数の型がDATEであり、データベース内のデータが他の型であり、DATE値として解釈することができない値を含みます。 (SQLSTATE 42804)

-210

ホスト変数の型がTIMESTAMPであり、データベース内のデータが他の型であり、TIMESTAMP値として解釈することができない値を含みます。 (SQLSTATE 42804)

-211

これは、ホスト変数の型がBOOLですが、データベース内のデータが't'でも'f'でもなかったことを意味します。 (SQLSTATE 42804)

-212

PostgreSQLサーバに送信されたSQL文が空でした (通常埋め込みSQLプログラムでは発生しません。ですので、これは内部エラーを示しているかもしれません)。 (SQLSTATE YE002)

-213

NULL値が返されましたが、NULL用の指示子変数が与えられていませんでした。 (SQLSTATE 22002)

-214

配列が必要な箇所に普通の変数が使用されていました。 (SQLSTATE 42804)

-215

配列値が必要な箇所にデータベースが普通の変数を返しました。 (SQLSTATE 42804)

-220

存在しない接続にプログラムがアクセスしようとしました。 (SQLSTATE 08003)

-221

存在するが開いていない接続にプログラムがアクセスしようとしました (これは内部エラーです)。 (SQLSTATE YE002)

-230

使用しようとしたSQL文がプリペアされていませんでした。 (SQLSTATE 26000)

-240

指定した記述子が見つかりませんでした。 使用しようとしたSQL文はプリペアされていませんでした。 (SQLSTATE 33000)

-241

記述子のインデックスが範囲外でした。 (SQLSTATE 07009)

-242

無効な記述子項目が要求されました。(これは内部エラーです。) (SQLSTATE YE002)

-243

動的なSQL文の実行時にデータベースが数値を返しましたが、ホスト変数が数値でありませんでした。 (SQLSTATE 07006)

-244

動的なSQL文の実行時にデータベースが数値以外を返しましたが、ホスト変数が数値でした。 (SQLSTATE 07006)

-400

PostgreSQLサーバで何らかのエラーが発生しました。 このメッセージはPostgreSQLサーバからのエラーメッセージを含みます。

-401

PostgreSQLサーバがトランザクションのコミットやロールバックを始めることができないことを通知しました。 (SQLSTATE 08007)

-402

データベースへの接続試行に失敗しました。 (SQLSTATE 08001)

-403

重複キーエラー。一意性制約違反。 (SQLSTATE 23505)

-404

副問い合わせの結果が単一行ではありません。 (SQLSTATE 21000)

-602

無効なカーソル名が指定されました。 (SQLSTATE 34000)

-603

トランザクションが進行中です。 (SQLSTATE 25001)

-604

活動中(進行中)のトランザクションがありません。 (SQLSTATE 25P01)

-605

既存のカーソル名が指定されました。 (SQLSTATE 42P03)