ヘッダーをスキップ

Oracle Rdb SQLリファレンス・マニュアル リリース7.2 E06178-01 |
| 目次 | 索引

戻る | 次へ |

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

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

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

- メッセージ・ベクター・フィールドRDB$LU_STATUSでの、直前のSQL文からの戻りステータス値のチェック。プログラムではそのフィールドの下位ビット（設定されている場合は正常終了）をチェックすることも、フィールド全体を使用して特定の戻りステータス値を確認することもできます。

- sql_signalルーチンおよびsql_get_error_textルーチンでのメッセージ・ベクターの使用。

  - sql_signalルーチンは、メッセージ・ベクターを使用してOpenVMS条件ハンドラにエラーのシグナルを発行します。

  - sql_get_error_textルーチンは、メッセージ・ベクターの戻りステータス値に対応するメッセージ・テキストを、プログラムによって指定されたバッファに入れます。

  sql_signalおよびsql_get_error_textの詳細は、第5章を参照してください。

図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文のステータスを返すことです。各ステータス・パラメータにより情報が提供され、文が実行を完了したかあるいは例外が発生したかを確認できます。次のような例外の発生時には、これらのステータス・パラメータが提供する診断情報の量が異なります。

- SQLCODE: 元のSQLエラー処理メカニズムです。整数値です。SQLCODEでは、エラー（負数）、警告（正数）、正常終了（0）、および特殊コード（100: データなし）を区別します。SQLCODEはANSI/ISO SQL規格の廃止予定の機能です。

- SQLCA: SQLCODEエラー処理メカニズムの機能拡張版です。SQLCODE値を補足するコンテキスト情報を含んでいます。SQLCAは、ANSI/ISO SQL規格には組み込まれていません。ただし、DB2やORACLE RDBMSなどの多くのデータベースでは、実装する独自のセマンティクスおよび構文を定義しています。

- SQLSTATE: ANSI/ISO SQL規格のエラー処理メカニズムです。SQLSTATE値は、診断情報に関連付けられた文字列です。

この項では次のSQLSTATEに関する項目について説明します。

- SQLSTATEステータス・パラメータの定義

- 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を使用