SQLは、プログラムをプリコンパイルすると、SQLCAの直後にメッセージ・ベクターのホスト構造体を宣言します。また、構造体RDB$MESSAGE_VECTORをコールします。
プログラムでは、通常次の2つの方法でメッセージ・ベクターが使用されます。
sql_signalおよびsql_get_error_textの詳細は、第5章を参照してください。
図C-1は、メッセージ・ベクターのフィールドの概要を示しています。
図C-1 メッセージ・ベクターのフィールド
この項では、SQLプリコンパイラおよびモジュール・プロセッサによってサポートされているホスト言語のSQLCAおよびメッセージ・ベクターの宣言について説明します。
例C-3は、Ada SQLCAおよびメッセージ・ベクターの宣言を示しています。
例C-3 Ada SQLCAおよびメッセージ・ベクターの宣言 |
---|
Package SQL_ADA_CURSOR is TYPE SQL_TYPE_1 IS NEW STRING(1..6); type SQLERRM_REC is record SQLERRML : short_integer; SQLERRMC : string (1..70); end record; type SQLERRD_ARRAY is array (1..6) of integer; type SQLCA is record SQLCAID : string (1..8) := "SQLCA "; SQLABC : integer := 128; SQLCODE : integer; SQLERRM : sqlerrm_rec; SQLERRD : sqlerrd_array; SQLWARN0 : character := ' '; SQLWARN1 : character := ' '; SQLWARN2 : character := ' '; SQLWARN3 : character := ' '; SQLWARN4 : character := ' '; SQLWARN5 : character := ' '; SQLWARN6 : character := ' '; SQLWARN7 : character := ' '; SQLEXT : string (1..8) := " "; end record; RDB_MESSAGE_VECTOR : SYSTEM.UNSIGNED_LONGWORD_ARRAY(1..20); pragma PSECT_OBJECT(RDB_MESSAGE_VECTOR,"RDB$MESSAGE_VECTOR"); |
例C-4は、BASIC SQLCAおよびメッセージ・ベクターの宣言を示しています。
例C-4 BASIC SQLCAおよびメッセージ・ベクターの宣言 |
---|
RECORD SQLCA_REC string SQLCAID = 8 long SQLCABC long SQLCODE GROUP SQLERRM word SQLERRML string SQLERRMC = 70 END GROUP SQLERRM long SQLERRD(5) string SQLWARN0 = 1 string SQLWARN1 = 1 string SQLWARN2 = 1 string SQLWARN3 = 1 string SQLWARN4 = 1 string SQLWARN5 = 1 string SQLWARN6 = 1 string SQLWARN7 = 1 string SQLEXT = 8 END RECORD SQLCA_REC DECLARE SQLCA_REC SQLCA RECORD RDB$MESSAGE_VECTOR_REC long RDB$LU_NUM_ARGUMENTS long RDB$LU_STATUS GROUP RDB$ALU_ARGUMENTS(17) ! Arrays in BASIC are always relative long RDB$LU_ARGUMENT ! to 0. There are 18 array elements. END GROUP RDB$ALU_ARGUMENTS END RECORD RDB$MESSAGE_VECTOR_REC COMMON (RDB$MESSAGE_VECTOR) & RDB$MESSAGE_VECTOR_REC RDB$MESSAGE_VECTOR |
例C-5は、C SQLCAおよびメッセージ・ベクターの宣言を示しています。
例C-5 C SQLCAおよびメッセージ・ベクターの宣言 |
---|
struct { char SQLCAID[8]; int SQLCABC; int SQLCODE; struct { short SQLERRML; char SQLERRMC[70]; } SQLERRM; int SQLERRD[6]; struct { char SQLWARN0[1]; char SQLWARN1[1]; char SQLWARN2[1]; char SQLWARN3[1]; char SQLWARN4[1]; char SQLWARN5[1]; char SQLWARN6[1]; char SQLWARN7[1]; } SQLWARN; char SQLEXT[8]; } SQLCA = { {'S','Q','L','C','A',' ',' ',' '}, 128, 0, {0, ""}, {0,0,0,0,0,0}, {"", "", "", "", "", "", "", ""}, "" }; extern struct Rdb$MESSAGE_VECTOR_str RDB$MESSAGE_VECTOR; |
例C-6は、COBOLのSQLCAおよびメッセージ・ベクターの宣言を示しています。
例C-6 COBOLのSQLCAおよびメッセージ・ベクターの宣言 |
---|
01 SQLCA GLOBAL. 02 SQLCAID PIC X(8) VALUE IS "SQLCA ". 02 SQLCABC PIC S9(9) COMP VALUE IS 128. 02 SQLCODE PIC S9(9) COMP. 02 SQLERRM. 03 SQLERRML PIC S9(4) COMP VALUE IS 0. 03 SQLERRMC PIC X(70). 02 SQLERRD PIC S9(9) COMP OCCURS 6 TIMES. 02 SQLWARN. 03 SQLWARN0 PIC X. 03 SQLWARN1 PIC X. 03 SQLWARN2 PIC X. 03 SQLWARN3 PIC X. 03 SQLWARN4 PIC X. 03 SQLWARN5 PIC X. 03 SQLWARN6 PIC X. 03 SQLWARN7 PIC X. 02 SQLEXT PIC X(8). 01 Rdb$MESSAGE_VECTOR EXTERNAL GLOBAL. 03 Rdb$LU_NUM_ARGUMENTS PIC S9(9) COMP. 03 Rdb$LU_STATUS PIC S9(9) COMP. 03 Rdb$ALU_ARGUMENTS OCCURS 18 TIMES. 05 Rdb$LU_ARGUMENTS PIC S9(9) COMP. |
例C-7は、FORTRAN SQLCAおよびメッセージ・ベクターの宣言を示しています。
例C-7 FORTRAN SQLCAおよびメッセージ・ベクターの宣言 |
---|
CHARACTER*1 SQLCA (128) INTEGER*4 SQLCOD EQUIVALENCE (SQLCOD, SQLCA(13)) INTEGER*2 SQLTXL EQUIVALENCE (SQLTXL, SQLCA(17)) CHARACTER*70 SQLTXT EQUIVALENCE (SQLTXT, SQLCA(19)) INTEGER*4 SQLERR(1:6) EQUIVALENCE (SQLERR, SQLCA(89)) CHARACTER*1 SQLWRN(0:7) EQUIVALENCE (SQLWRN, SQLCA(113)) INTEGER*4 Rdb$MESSAGE_VECTOR(20), Rdb$LU_NUM_ARGUMENTS INTEGER*4 Rdb$LU_STATUS, Rdb$ALU_ARGUMENTS(18) COMMON /Rdb$MESSAGE_VECTOR/ Rdb$MESSAGE_VECTOR EQUIVALENCE ( Rdb$MESSAGE_VECTOR(1),Rdb$LU_NUM_ARGUMENTS) EQUIVALENCE ( Rdb$MESSAGE_VECTOR(2), Rdb$LU_STATUS) EQUIVALENCE ( Rdb$MESSAGE_VECTOR(3), Rdb$ALU_ARGUMENTS ) |
例C-8は、Pascal SQLCAおよびメッセージ・ベクターの宣言を示しています。
例C-8 Pascal SQLCAおよびメッセージ・ベクターの宣言 |
---|
TYPE RDB$LU_ARGUMENTS = [HIDDEN] INTEGER; RDB$ALU_ARGUMENTS_ARRAY = [HIDDEN] ARRAY [1..18] OF RDB$LU_ARGUMENTS; RDB$MESSAGE_VECTOR_REC = [HIDDEN] RECORD RDB$LU_NUM_ARGUMENTS : INTEGER; RDB$LU_STATUS : INTEGER; RDB$ALU_ARGUMENTS : RDB$ALU_ARGUMENTS_ARRAY; END; VAR RDB$MESSAGE_VECTOR : [HIDDEN, common(rdb$message_vector) ] RDB$MESSAGE_VECTOR_REC; TYPE SQL$SQLCA_REC = [HIDDEN] RECORD SQLCAID : PACKED ARRAY [1..8] OF CHAR; SQLCABC : INTEGER; SQLCODE : INTEGER; SQLERRM : RECORD SQLERRML : SQL$SMALLINT; SQLERRMC : PACKED ARRAY [1..70] OF CHAR; END; SQLERRD : ARRAY [1..6] OF INTEGER; SQLWARN : RECORD SQLWARN0 : CHAR; SQLWARN1 : CHAR; SQLWARN2 : CHAR; SQLWARN3 : CHAR; SQLWARN4 : CHAR; SQLWARN5 : CHAR; SQLWARN6 : CHAR; SQLWARN7 : CHAR; END; SQLEXT : PACKED ARRAY [1..8] OF CHAR; END; VAR RDB$DBHANDLE : [HIDDEN] INTEGER; SQLCA : [HIDDEN] SQL$SQLCA_REC; |
例C-9は、PL/I SQLCAおよびメッセージ・ベクターの宣言を示しています。
例C-9 PL/I SQLCAおよびメッセージ・ベクターの宣言 |
---|
DCL 1 SQLCA STATIC , 2 SQLCAID character(8) INITIAL('SQLCA '), 2 SQLCABC fixed binary(31) INITIAL(128), 2 SQLCODE fixed binary(31), 2 SQLERRM , 3 SQLERRML fixed binary(15) INITIAL(0), 3 SQLERRMC character(70), 2 SQLERRD (1:6) fixed binary(31), 2 SQLWARN , 3 SQLWARN0 character(1), 3 SQLWARN1 character(1), 3 SQLWARN2 character(1), 3 SQLWARN3 character(1), 3 SQLWARN4 character(1), 3 SQLWARN5 character(1), 3 SQLWARN6 character(1), 3 SQLWARN7 character(1), 2 SQLEXT character(8); DCL 1 Rdb$MESSAGE_VECTOR EXTERNAL, 2 Rdb$LU_NUM_ARGUMENTS FIXED BINARY(31), 2 Rdb$LU_STATUS FIXED BINARY(31), 2 Rdb$ALU_ARGUMENTS (18), 3 Rdb$LU_ARGUMENTS FIXED BINARY (31); |
CのSQL_SQLCA.Hファイルなど、SQLCAインクルード・ファイルの使用は、ホスト言語ファイルでの使用のみを目的としたものです。つまり、そのファイルには*.Cのみが含まれます。プリコンパイルされたファイル(*.SCファイル)は、モジュールの宣言部ではEXEC SQL INCLUDE SQLCA埋込みSQLコマンドを使用する必要があります。プリコンパイラは、このようにして関連SQL生成コードによって使用される構造体を正しく定義できます。
ルーチン固有のSQLCODE変数やSQLSTAT変数と異なり、SQLCAは常にモジュール・レベルでスコープが設定されています。
C.5 SQLSTATE
SQLでは一連のステータス・パラメータを定義し、これは非ストアド・モジュールのプロシージャ定義用パラメータ・リストの一部にできます。そのパラメータとはSQLSTATE、SQLCODEおよびSQLCAです。SQLプロシージャでは、このようなステータス・パラメータを1つ以上そのパラメータ・リスト内に含む必要があります。すべてのステータス・パラメータは暗黙的に出力パラメータです。
これらのステータス・パラメータの目的は、実行される各SQL文のステータスを返すことです。各ステータス・パラメータにより情報が提供され、文が実行を完了したかあるいは例外が発生したかを確認できます。次のような例外の発生時には、これらのステータス・パラメータが提供する診断情報の量が異なります。
この項では次のSQLSTATEに関する項目について説明します。
SQLSTATEステータス・パラメータに返される値は、5文字の文字列です。2文字のクラス値と後続の3文字のサブクラス値で構成されます。各クラス値は、成功、接続例外、データ例外などの実行条件に対応します。各サブクラスはその実行条件のサブセットに対応します。たとえば、接続例外は、「接続名が使用中」、「接続が存在しない」および「接続障害」のカテゴリで区別されます。サブクラス000はサブ条件がないことを意味します。
表C-4は、対応する実行条件でSQLが定義したSQLSTATE値を示しています。文字RまたはSで始まるSQLSTATEクラスは、Oracle Rdb固有のSQLSTATE値です。
クラス/サブクラス | 条件 | サブ条件 |
---|---|---|
00000 | 正常終了 | サブ条件なし |
01000 | 警告 | サブ条件なし |
01003 | 集計関数でNULL値が省略された。 | |
01004 | 文字列データの右端を切り捨てた。 | |
02000 | データなし | サブ条件なし |
08002 | 接続例外 | 接続名が使用中 |
08003 | 接続が存在しない。 | |
08006 | 接続障害 | |
09000 | トリガーによるアクション例外 | サブ条件なし |
20000 | CASE文にCaseが見つからない。 | サブ条件なし |
21000 | シングルトン選択により複数の値が返された。 | サブ条件なし |
22001 | データ例外 | 文字列データの右端を切り捨てた。 |
22002 | NULL値、またはインジケータ・パラメータがない。 | |
22003 | 範囲外の数値 | |
22004 | NULL値の不許可 | |
22005 | 代入エラー | |
22006 | 無効なフェッチ方向 | |
22007 | 無効な日時書式 | |
22008 | 日時フィールドのオーバーフロー | |
22009 | 無効なタイムゾーン置換値 | |
22010 | 無効なインジケータ・パラメータの値 | |
22011 | サブストリング・エラー | |
22012 | ゼロ除算 | |
22015 | 日時フィールドのオーバーフロー | |
22018 | キャストに無効な文字値 | |
22019 | 無効なエスケープ文字 | |
22020 | 無効な制限値 | |
22021 | 許可範囲外の文字 | |
22022 | インジケータのオーバーフロー | |
22023 | 無効なパラメータ値 | |
22024 | 終了していないC文字列 | |
22025 | 無効なエスケープ・シーケンス | |
22027 | 切捨てエラー | |
2201B | 無効な正規表現 | |
2200F | 長さゼロの文字列 | |
23000 | 整合性制約違反 | サブ条件なし |
24000 | 無効なカーソル状態 | サブ条件なし |
25000 | 無効なトランザクション状態 | サブ条件なし |
25001 | アクティブなSQLトランザクション | |
25006 | 読取り専用SQLトランザクション | |
26000 | 無効なSQL文識別子 | サブ条件なし |
2F000 | SQLルーチン例外 | サブ条件なし |
2F005 | 実行したファンクションにRETURN文が存在しない。 | |
30000 | 無効なSQL文 | サブ条件なし |
31000 | 無効なターゲット指定値 | サブ条件なし |
32000 | 無効な制約モード状態 | サブ条件なし |
33000 | 無効なSQL記述子名 | サブ条件なし |
34000 | 無効なカーソル名 | サブ条件なし |
35000 | 無効な条件番号 | サブ条件なし |
37000 | データベース指定構文エラー | サブ条件なし |
38000 | 外部プロシージャ例外 | サブ条件なし |
39000 | 外部プロシージャ・コール例外 | サブ条件なし |
39001 | 無効なSQLSTATEが返された。 | |
3C000 | あいまいなカーソル名 | サブ条件なし |
3E000 | 無効なカタログ名 | サブ条件なし |
3F000 | 無効なスキーマ名 | サブ条件なし |
42000 | 構文エラー、またはアクセス・ルール違反 | サブ条件なし |
44000 | チェック・オプション違反 | サブ条件なし |
R10011 | ロック・エラー例外 | デッドロックが発生 |
R10021 | ロックの競合が発生 | |
R20001 | 索引で重複値が許可されていない。 | サブ条件なし |
R30002 | トリガーによるERROR文の強制実行 | サブ条件なし |
R40001 | 分散トランザクションIDエラー | サブ条件なし |
R50001 | 読取り専用表を更新しようとした。 | サブ条件なし |
R60001 | メタデータは使用不可 | サブ条件なし |
R70001 | 当該の表がトランザクションに予約されていない。 | サブ条件なし |
RR0001 | Oracle Rdbによってエラーが返された。 | サブ条件なし |
S00001 | 暗黙的トランザクションがない。 | サブ条件なし |
S10011 | コンテキスト例外 | コンテキスト構造体のバージョンが不正 |
S10021 | コンテキスト構造体のタイプが不正 | |
S10031 | コンテキスト構造体の長さが不正 | |
S20001 | リストを含んだ行が削除されている。 | サブ条件なし |
S30001 | 実行者が定義者と異なる。 | サブ条件なし |
S40011 | 別名例外 | 不明の別名 |
S40021 | 別名はすでに宣言されている。 | |
S70001 | 基礎システムが使用されている機能をサポートしていない。 | サブ条件なし |
S60003 | Caseが見つからない。WHENまたはELSEが指定されていない。 | サブ条件なし |
S70001 | SQLのバージョンが不正 | サブ条件なし |
S50011 | 列に対して負の長さおよびスケールが指定されている。 | 列に対して負の長さが指定されている。 |
S5002 1 | 列に対して負のスケールが指定されている。 |