ヘッダーをスキップ

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

戻る | 次へ |

# sql_get_message_vector

最後のSQL文のステータスに関する情報をメッセージ・ベクターから取得します。

## 形式

>     sql_get_message_vector (addr, index)

## 戻り値

> 戻り値はありません。

## 引数

> ### addr

> リクエストされたベクター要素が書き込まれる変数のアドレスです。

> 値: | ベクター要素を受け取るために宣言される変数のアドレス
> データ型: ロングワード（32ビット） |
> 受渡しメカニズム: | 参照

> ### index

> 返されるベクター要素の索引値です。

> 値: | 1以上20以下の値
> データ型: | 符号なしロングワード
> 受渡しメカニズム: | 値

> 次の表は、索引値と、ベクター要素および各ベクター要素に含まれる情報にこれらの索引値をマップする方法を示しています。

> 索引値 | 返される情報
> --- | ---
> 1 | ベクター内の引数の数
> 2 | 最後のSQL文の1次ステータス・コード
> 3 | プライマリ・メッセージに対するFAO引数の数
> 4〜20 | 後続メッセージの戻りステータス（存在する場合）

## 説明

> sql_get_message_vectorルーチンを使用して、RDB$MESSAGE_VECTOR配列から情報を取得します。この配列は、SQL文の実行ステータスに関する情報を提供します。sql_get_message_vectorルーチンの索引2により、最後のSQL文の1次ステータス・コードが返されます。この索引は、SQLCODEステータス・パラメータに相当します。

> ANSI/ISO SQL規格には、sql_get_message_vectorルーチンやRDB$MESSAGE_VECTOR配列は含まれません。この規格に準拠するアプリケーション・プログラムの場合は、SQLCODEステータス・パラメータまたはSQLSTATEステータス・パラメータを使用します。また、Oracle Rdbの将来のバージョンでは、特定の条件下で返されるステータス値が変更される可能性があります。

> メッセージ・ベクターに格納されるステータス値は、SQLCODEステータス・パラメータまたはSQLSTATEステータス・パラメータの補足情報用です。SQLCODEまたはSQLSTATEによって提供される情報があいまいで、アプリケーションでエラー条件を処理するためにより明確なエラー・コードが必要である場合は、sql_get_message_vectorルーチンを使用します。

> 表5-2は、sql_message_vectorによって返される索引とRDB$MESSAGE_VECTORのフィールドの関係を示しています。

> 表5-2 sql_message_vectorとRDB$MESSAGE_VECTORの関係
> sql_message_vectorの索引 | RDB$MESSAGE_VECTORのフィールド
> --- | ---
> 索引1 | RDB$LU_NUM_ARGUMENTS
> 索引2 | RDB$LU_STATUS
> 索引3 | RDB$LU_ARGUMENTS
> 索引4〜20 | 後続メッセージの戻りステータス（存在する場合）

## 使用方法

> - 次のリストは、sql_get_message_vectorルーチンを使用可能な言語と、各言語からのコール方法を示しています。

>   - Ada

>         procedure sql_get_message_vector (buffer_name : out ;
>                                           index: in );
>         pragma INTERFACE (NONADA, sql_get_message_vector):

>         pragma IMPORT_PROCEDURE (INTERNAL => sql_get_message_vector,
>                                  EXTERNAL => "sql_get_message_vector",
>                                  PARAMETER_TYPES => (integer,integer)
>                                  MECHANISM =>(REFERENCE, VALUE));

>   - BASIC

>         external sub sql_get_message_vector(long by ref, long by value)
>         call sql_get_message_vector(buffer_name, index)

>   - C

>         int buffer_name;
>         int index;

>         sql_get_message_vector(&buffer_name, index);

>     引数をintデータ型として宣言すると、すべてのプラットフォームで正しいデータ型が使用されます。

>   - COBOL

>         CALL 'sql_get_message_vector' USING BY REFERENCE buffer-name
>                                       BY VALUE index

>   - FORTRAN

>         CALL sql_get_message_vector (buffer-name, index)

>   - Pascal

>         var
>             buffer, index : integer;

>         procedure sql_get_message_vector (
>             var buffer: integer;
>             index : [immediate,readonly] integer ); external;

>         sql_get_message_vector (buffer, index);

>   - PL/I

>         DCL sql_get_message_vector ENTRY (ANY, FIXED(31) BIN);
>         CALL sql_get_message_vector (REFERENCE(buffer-name),index)

## 関連ルーチン

> なし。

## 例

> 次の例は、SQLモジュールをコールし、sql_get_message_vectorを使用してSQL文のステータスを返すCプログラムの抜粋です。

>        .
>        .
>        .
>     /* Error handler, using sql_get_message_vector. */

>     get_msgvec( )

>     {
>     int index;
>     int status_code;
>     int arg_cnt;

>     /* Declare the literal for contraint violation status. */
>     int RDB$_INTEG_FAIL;

>     /* Get the message vector argument count. */

>     index = 1;
>     sql_get_message_vector(&arg_cnt, index);

>     /* Get the status code. */

>     index = 2;
>     sql_get_message_vector(&status_code, index);

>       if (status_code == RDB$_INTEG_FAIL)
>          printf("Constraint violation. ");
>          printf("You are trying to insert a department code\n");
>          printf("which already exists in the table.");
>          exit(1);

>     /* You can also check for the follow-on arguments, if the arg_cnt is greater
>     *  than 1.
>     */
>     }

>     main( )
>     {
>        .
>        .
>        .

>       insert_data (&SQLCODE, department_code, department_name, manager_id);
>       if (SQLCODE != 0)
>        get_msgvec();

>     }