プライマリ・コンテンツに移動
Pro*C/C++プログラマーズ・ガイド
12c リリース1(12.1)
B71397-03
目次へ移動
目次
索引へ移動
索引

前
次

SQLSTATE状態変数

プリコンパイラの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は削除されています。

SQLSTATEの宣言について

MODE=ANSIのときは、SQLSTATEまたはSQLCODEを宣言する必要があります。SQLCAの宣言はオプションです。MODE=ORACLEのときは、SQLSTATEを宣言しても無視されます。

SQLCODEでは符号付き整数を格納し、宣言部の外で宣言できますが、SQLSTATEではヌル文字で終了する5文字の文字列を格納し、宣言部の中で宣言する必要があります。次のようにSQLSTATEを宣言します。

char  SQLSTATE[6];  /* Upper case is required. */ 

注意:

SQLSTATEは正確に6文字のサイズで宣言する必要があります。

SQLSTATE値

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 SQLSTATEコード化体系

SQLSTATEコード体系
「図9-1 SQLSTATEコード化体系」の説明

表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

リモート・データベース・アクセス

--

SQLSTATEの使用について

次の規則は、オプションの設定をMODE=ANSIにしてプリコンパイルするときに、SQLSTATEをSQLCODEまたはSQLCAと併用する場合に適用されます。SQLSTATEは宣言部内で宣言する必要があります。宣言部内で宣言しなければ無視されます。

SQLSTATEを宣言する場合

  • SQLCODEの宣言はオプションです。宣言部の内部でSQLCODEを宣言すると、SQL処理を実行するたびにOracleサーバーはSQLSTATEおよびSQLCODEにステータス・コードを戻します。ただし、宣言部の外部でSQLCODEを宣言すると、OracleはSQLSTATEのみにステータス・コードを戻します。

  • SQLCAの宣言はオプションです。SQLCAを宣言すると、OracleはSQLSTATEおよびSQLCAにステータス・コードを戻します。この場合は、コンパイル・エラーを防ぐために、SQLCODEを宣言しないでください

SQLSTATEを宣言しない場合

  • 宣言部の内部または外部で、SQLCODEを宣言する必要があります。SQL処理を実行するたびに、OracleサーバーはSQLCODEにステータス・コードを戻します。

  • SQLCAの宣言はオプションです。SQLCAを宣言すると、OracleはSQLCODEおよびSQLCAにステータス・コードを戻します。

独自のコードを作成してSQLSTATEを明示的にチェックするか、WHENEVER SQLERRORディレクティブを使用してSQLSTATEを暗黙的にチェックすることで、最新の実行SQL文の結果が得られます。実行SQL文およびPL/SQL文の後にのみSQLSTATEをチェックしてください。