ヘッダーをスキップ
Oracle Rdb SQLリファレンス・マニュアル
リリース7.2
E06178-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

C.2 メッセージ・ベクター

SQLは、プログラムをプリコンパイルすると、SQLCAの直後にメッセージ・ベクターのホスト構造体を宣言します。また、構造体RDB$MESSAGE_VECTORをコールします。

プログラムでは、通常次の2つの方法でメッセージ・ベクターが使用されます。

図C-1は、メッセージ・ベクターのフィールドの概要を示しています。

図C-1 メッセージ・ベクターのフィールド


C.3 SQLCAおよびメッセージ・ベクターの宣言

この項では、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.4 SQLCAインクルード・ファイルの使用

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に関する項目について説明します。

C.5.1 SQLSTATEステータス・パラメータの定義

SQLSTATEステータス・パラメータに返される値は、5文字の文字列です。2文字のクラス値と後続の3文字のサブクラス値で構成されます。各クラス値は、成功、接続例外、データ例外などの実行条件に対応します。各サブクラスはその実行条件のサブセットに対応します。たとえば、接続例外は、「接続名が使用中」、「接続が存在しない」および「接続障害」のカテゴリで区別されます。サブクラス000はサブ条件がないことを意味します。

表C-4は、対応する実行条件でSQLが定義したSQLSTATE値を示しています。文字RまたはSで始まるSQLSTATEクラスは、Oracle Rdb固有のSQLSTATE値です。

表C-4 SQLSTATEステータス・パラメータ(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   列に対して負のスケールが指定されている。


1Oracle Rdb固有のSQLSTATEコード
2廃止。かわりにSQLSTATE 09000を使用
3廃止。かわりにSQLSTATE 20000を使用