ヘッダーをスキップ
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モジュールをコールし、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();

}