プリコンパイラのMODEコマンドライン・オプションは、ANSI/ISOへの準拠を制御します。MODE=ANSIのとき、SQLCAデータ構造体の宣言はオプションです。ただし、SQLCODEという状態変数は別に宣言する必要があります。SQL標準では、SQLSTATEという類似した状態変数が指定されています。SQLSTATEは、SQLCODEとともに使用しても別々に使用してもかまいません。
SQL文の実行後、Oracleサーバーは現在の適用範囲内のSQLSTATE変数にステータス・コードを戻します。ステータス・コードは、SQL文が正常に実行されたか例外(エラーまたは警告状態)が発生したかを示します。相互運用性(システム間で情報を簡単に交換する機能)を高めるために、共通のSQL例外がすべてSQL標準によってあらかじめ定義されています。
SQLCODEにはエラー・コードのみが格納されるのに対し、SQLSTATEにはエラー・コードおよび警告コードが格納されます。さらに、SQLSTATEの報告のメカニズムには、標準化されたコード化方式が採用されています。このため、SQLSTATEは状態変数として優先されます。SQLCODEは、SQL-89との互換性を保つためにのみ維持されていた、SQL-92の非推奨の機能です。SQL-92より後のすべてのSQL標準バージョンで、SQLCODEは削除されています。
MODE=ANSIのときは、SQLSTATEまたはSQLCODEを宣言する必要があります。SQLCAの宣言はオプションです。MODE=ORACLEのときは、SQLSTATEを宣言しても無視されます。
SQLCODEでは符号付き整数を格納し、宣言部の外で宣言できますが、SQLSTATEではヌル文字で終了する5文字の文字列を格納し、宣言部の中で宣言する必要があります。次のようにSQLSTATEを宣言します。
char SQLSTATE[6]; /* Upper case is required. */
注意:
SQLSTATEは正確に6文字のサイズで宣言する必要があります。
SQLSTATEステータス・コードは、2文字のクラス・コードおよびその後に続く3文字のサブクラス・コードで構成されます。クラス・コード00(正常終了)以外のときには、クラス・コードは例外のカテゴリを示します。また、サブクラス・コード000(適用外)以外では、サブクラス・コードはそのカテゴリ内の特定の例外を示します。たとえば、SQLSTATEの値22012はクラス・コード22(データ例外)とサブクラス・コード012(ゼロ除算)を示します。
SQLSTATE値の5文字は、それぞれ数字(0から9)または大文字の英文字(AからZ)で構成されます。0から4の範囲の数字、またはAからHの範囲の文字で始まるクラス・コードは、事前定義済の状態(SQL標準で定義されている)用に確保されています。他のすべてのクラス・コードは実装定義の状態用に確保されています。事前定義クラスのうち、0から4の数字またはAからHの文字で始まるサブクラス・コードは、事前定義の副条件用に予約されています。他のすべてのサブクラス・コードは、実装時に定義される副条件用に予約されています。図9-1にコード化体系を示します。
表9-1にSQL92で事前定義済のクラスを示します。
表9-1 事前定義済のクラス・コード
クラス | 条件 |
---|---|
00 |
正常終了 |
01 |
警告 |
02 |
データなし |
07 |
動的SQLエラー |
08 |
接続例外 |
09 |
トリガー・アクション例外 |
0A |
サポートされていない機能 |
0D |
ターゲット・タイプの指定が無効 |
0E |
スキーマ名リストの指定が無効 |
0F |
ロケータ例外 |
0L |
権限付与者が無効 |
0M |
SQLが呼び出したプロシージャ参照が無効 |
0P |
ロール指定が無効 |
0S |
変換グループ名の指定が無効 |
0T |
ターゲット表がカーソル仕様と不一致 |
0U |
更新可能でない列への割当て試行 |
0V |
順序付け列への割当て試行 |
0W |
トリガー実行中の禁止された文の発生 |
0Z |
診断の例外 |
21 |
カーディナリティ違反 |
22 |
データの例外 |
23 |
整合性制約違反 |
24 |
カーソル状態が無効 |
25 |
トランザクション状態が無効 |
26 |
SQL文名が無効 |
27 |
トリガー・データの変更違反 |
28 |
認証の指定が無効 |
2A |
直接SQL構文エラーまたはアクセス規則違反 |
2B |
依存権限記述子がまだ存在しています。 |
2C |
キャラクタ・セット名が無効 |
2D |
トランザクションの終了が無効 |
2E |
接続名が無効 |
2F |
SQLルーチンの例外 |
2H |
照合名が無効 |
30 |
SQL文識別子が無効 |
33 |
SQL記述子名が無効 |
34 |
カーソル名が無効 |
35 |
状態番号が無効 |
36 |
カーソル更新検出例外 |
37 |
動的SQL構文エラーまたはアクセス規則違反 |
38 |
外部ルーチンの例外 |
39 |
外部ルーチン呼出しの例外 |
3B |
セーブポイントの例外 |
3C |
カーソル名があいまい |
3D |
カタログ名が無効 |
3F |
スキーマ名が無効 |
40 |
トランザクションのロールバック |
42 |
構文エラーまたはアクセス規則違反 |
44 |
WITH_CHECK_OPTION指定違反 |
HZ |
リモート・データベース・アクセス |
注意:
クラス・コードHZは、国際標準規格ISO/IEC DIS 9579-2で定義された条件であるリモート・データベース・アクセス用に確保されています。
表9-2に、SQLSTATEステータス・コードと条件のOracleエラーとの対応を示します。60000から99999の範囲のステータス・コードは実装時に定義されます。
表9-2 SQLSTATEステータス・コード
コード | 条件 | Oracleエラー |
---|---|---|
00000 |
正常終了 |
ORA-00000 |
01000 |
警告 |
-- |
01001 |
カーソル操作の競合 |
-- |
01002 |
切断エラー |
-- |
01003 |
集合関数でNULL値が削除されている |
-- |
01004 |
文字列データの右側切捨て |
-- |
01005 |
項目記述子領域が不十分 |
-- |
01006 |
権限が取り消されていない |
-- |
01007 |
権限が付与されていない |
-- |
01008 |
暗黙的なゼロビットの埋込み |
-- |
01009 |
情報スキーマの検索条件が長すぎます。 |
-- |
0100A |
情報スキーマの問合せ式が長すぎます。 |
-- |
02000 |
データなし |
ORA-01095 ORA-01403 |
07000 |
動的SQLエラー |
-- |
07001 |
USING句がパラメータ指定と一致しません。 |
-- |
07002 |
USING句が相手指定と一致しません。 |
-- |
07003 |
カーソル仕様を実行できません。 |
-- |
07004 |
動的パラメータにはUSING句が必要です。 |
-- |
07005 |
プリコンパイルされたSQL文がカーソル仕様ではありません。 |
-- |
07006 |
制限付きのデータ型属性違反 |
-- |
07007 |
結果コンポーネントにはUSING句が必要、記述子の数が無効 |
-- |
07008 |
記述子の数が無効 |
SQL-02126 |
07009 |
記述子の索引が無効 |
-- |
08000 |
接続例外 |
-- |
08001 |
SQLクライアントはSQL接続を確立できない |
-- |
08002 |
接続名を使用中 |
-- |
08003 |
接続が存在しません。 |
SQL-02121 |
08004 |
SQLサーバーがSQL接続を拒否した |
-- |
08006 |
接続の失敗 |
-- |
08007 |
トランザクション解決が不明 |
-- |
0A000 |
サポートされていない機能 |
ORA-03000から03099 |
0A001 |
複数のサーバー・トランザクション |
-- |
21000 |
カーディナリティ違反 |
ORA-01427 SQL-02112 |
22000 |
データの例外 |
-- |
22001 |
文字列データの右側切捨て |
ORA-01406 |
22002 |
NULL値 - インジケータ・パラメータなし |
SQL-02124 |
22003 |
数値が範囲外 |
ORA-01426 |
22005 |
割当てのエラー |
-- |
22007 |
日時書式が無効 |
-- |
22008 |
日時フィールドのオーバーフロー |
ORA-01800から01899 |
22009 |
タイム・ゾーンによる時差が無効 |
-- |
22011 |
部分文字列エラー |
-- |
22012 |
ゼロによる除算 |
ORA-01476 |
22015 |
間隔フィールドのオーバーフロー |
-- |
22018 |
キャストの文字値が無効 |
-- |
22019 |
エスケープ文字が無効 |
ORA-00911 |
22021 |
レパートリに文字がありません。 |
-- |
22022 |
インジケータのオーバーフロー |
ORA-01411 |
22023 |
パラメータ値が無効 |
ORA-01025 ORA-04000から04019 |
22024 |
C文字列が未終了 |
ORA-01479 ORA-01480 |
22025 |
エスケープ・シーケンスが無効 |
ORA-01424 ORA-01425 |
22026 |
文字列データの長さが不一致 |
ORA-01401 |
22027 |
切捨てエラー |
- |
23000 |
整合性制約違反 |
ORA-1400、ORA-02290から02299 |
24000 |
カーソル状態が無効 |
ORA-001002 ORA-001003 SQL-02114 SQL-02117 |
25000 |
トランザクション状態が無効 |
SQL-02118 |
26000 |
SQL文名が無効 |
-- |
27000 |
トリガー・データの変更違反 |
-- |
28000 |
認証の指定が無効 |
-- |
2A000 |
直接SQL構文エラーまたはアクセス規則違反 |
-- |
2B000 |
依存権限記述子がまだ存在しています。 |
-- |
2C000 |
キャラクタ・セット名が無効 |
-- |
2D000 |
トランザクションの終了が無効 |
-- |
2E000 |
接続名が無効 |
-- |
33000 |
SQL記述子名が無効 |
-- |
34000 |
カーソル名が無効 |
-- |
35000 |
状態番号が無効 |
-- |
37000 |
動的SQL構文エラーまたはアクセス規則違反 |
-- |
3C000 |
カーソル名があいまい |
-- |
3D000 |
カタログ名が無効 |
-- |
3F000 |
スキーマ名が無効 |
-- |
40000 |
トランザクションのロールバック |
ORA-02091 ORA-02092 |
40001 |
シリアライズの失敗 |
-- |
40002 |
整合性制約違反 |
-- |
40003 |
文の完了が不明 |
-- |
42000 |
構文エラーまたはアクセス規則違反 |
ORA-00022 ORA-00251 ORA-00900から00999 ORA-01031 ORA-01490..01493 ORA-01700から01799 ORA-01900から02099 ORA-02140から02289 ORA-02420から02424 ORA-02450から02499 ORA-03276から03299 ORA-04040から04059 ORA-04070から04099 |
44000 |
WITH_CHECK_OPTION指定違反 |
ORA-01402 |
60000 |
システム・エラー |
ORA-00370から00429 ORA-00600から00899 ORA-06430から06449 ORA-07200から07999 ORA-09700から09999 |
61000 |
共有サーバーおよび分離プロセスのエラー |
ORA-00018から00035 ORA-00050から00068 ORA-02376から02399 ORA-04020から04039 |
62000 |
共有サーバーおよび分離プロセスのエラー |
ORA-00100から00120 ORA-00440から00569 |
63000 |
Oracle*XAおよび2タスク・インタフェースのエラー |
ORA-00150から00159 ORA-02700から02899 ORA-03100から03199 ORA-06200から06249 SQL-02128 |
64000 |
制御ファイル、データベース・ファイルおよびREDOファイルのエラー、アーカイブおよびメディア・リカバリのエラー |
ORA-00200から00369 ORA-01100から01250 |
65000 |
PL/SQLのエラー |
ORA-06500から06599 |
66000 |
Oracle Netドライバのエラー |
ORA-06000から06149 ORA-06250から06429 ORA-06600から06999 ORA-12100から12299 ORA-12500から12599 |
67000 |
ライセンス許可エラー |
ORA-00430から00439 |
69000 |
SQL*Connectのエラー |
ORA-00570から00599 ORA-07000から07199 |
72000 |
SQL実行フェーズのエラー |
ORA-00001 ORA-01000から01099 ORA-01401から01489 ORA-01495から01499 ORA-01500から01699 ORA-02400から02419 ORA-02425から02449 ORA-04060から04069 ORA-08000から08190 ORA-12000から12019 ORA-12300から12499 ORA-12700から21999 |
82100 |
メモリー不足のためメモリーが割り当てられません。 |
SQL-02100 |
82101 |
カーソル・キャッシュが矛盾(UCE/CUCが不一致) |
SQL-02101 |
82102 |
カーソル・キャッシュが矛盾(UCEのCUCエントリがない) |
SQL-02102 |
82103 |
カーソル・キャッシュが矛盾(CUC参照の範囲外) |
SQL-02103 |
82104 |
カーソル・キャッシュが矛盾(使用可能なCUCがない) |
SQL-02104 |
82105 |
カーソル・キャッシュが矛盾(キャッシュにCUCエントリがない) |
SQL-02105 |
82106 |
カーソル・キャッシュが矛盾(カーソル番号が無効) |
SQL-02106 |
82107 |
ランタイム・ライブラリに対してプログラムが古すぎる; 再プリコンパイルが必要 |
SQL-02107 |
82108 |
ランタイム・ライブラリに無効な記述子が渡されました。 |
SQL-02108 |
82109 |
ホスト・キャッシュが矛盾(SIT参照が範囲外) |
SQL-02109 |
82110 |
ホスト・キャッシュが矛盾(SQLの型が無効) |
SQL-02110 |
82111 |
ヒープ一貫性のエラー |
SQL-02111 |
82113 |
コード生成の内部整合性の障害 |
SQL-02115 |
82114 |
リエントラント・コード・ジェネレータが無効なコンテキストを与えました。 |
SQL-02116 |
82117 |
データベースへの接続でのOPENまたはPREPAREが無効です。 |
SQL-02122 |
82118 |
アプリケーション・コンテキストが見つかりません。 |
SQL-02123 |
82119 |
エラー・メッセージのテキストを取り出せない |
SQL-02125 |
82120 |
プリコンパイラとSQLLIBのバージョンが不一致 |
SQL-02127 |
82121 |
NCHARエラー; フェッチされたバイト数が奇数 |
SQL-02129 |
82122 |
EXEC TOOLSインタフェースが使用できない |
SQL-02130 |
82123 |
ランタイム・コンテキストは使用中です。 |
SQL-02131 |
82124 |
ランタイム・コンテキストを割り当てできません。 |
SQL-02132 |
82125 |
スレッドで使用するプロセスを初期化できません。 |
SQL-02133 |
82126 |
ランタイム・コンテキストが無効 |
SQL-02134 |
HZ000 |
リモート・データベース・アクセス |
-- |
次の規則は、オプションの設定をMODE=ANSIにしてプリコンパイルするときに、SQLSTATEをSQLCODEまたはSQLCAと併用する場合に適用されます。SQLSTATEは宣言部内で宣言する必要があります。宣言部内で宣言しなければ無視されます。
SQLCODEの宣言はオプションです。宣言部の内部でSQLCODEを宣言すると、SQL処理を実行するたびにOracleサーバーはSQLSTATEおよびSQLCODEにステータス・コードを戻します。ただし、宣言部の外部でSQLCODEを宣言すると、OracleはSQLSTATEのみにステータス・コードを戻します。
SQLCAの宣言はオプションです。SQLCAを宣言すると、OracleはSQLSTATEおよびSQLCAにステータス・コードを戻します。この場合は、コンパイル・エラーを防ぐために、SQLCODEを宣言しないでください。
宣言部の内部または外部で、SQLCODEを宣言する必要があります。SQL処理を実行するたびに、OracleサーバーはSQLCODEにステータス・コードを戻します。
SQLCAの宣言はオプションです。SQLCAを宣言すると、OracleはSQLCODEおよびSQLCAにステータス・コードを戻します。
独自のコードを作成してSQLSTATEを明示的にチェックするか、WHENEVER SQLERRORディレクティブを使用してSQLSTATEを暗黙的にチェックすることで、最新の実行SQL文の結果が得られます。実行SQL文およびPL/SQL文の後にのみSQLSTATEをチェックしてください。