ヘッダーをスキップ
Oracle TimesTen In-Memory Database C開発者およびリファレンス・ガイド
リリース7.0
E05164-03
  目次へ
目次
索引へ
索引

前へ
前へ
次へ
次へ
 

XLAエラーの処理

ODBCまたはXLA関数をコールするたびに、エラーのリターン・コードを確認する必要があります。エラーが致命的である場合は、「XLAアプリケーションの終了」の説明に従ってプログラムを終了します。

エラーは、エラー番号またはtt_Err文字列のいずれかを使用して確認できます。TimesTenエラー(tt_Err 文字列および関連する番号の両方)の完全なリストについては、install_dir/include/tt_errCode.hファイルを参照してください。各メッセージについては、『Oracle TimesTen In-Memory Databaseエラー・メッセージおよびSNMPトラップ』のエラーおよび警告のリストに関する項を参照してください。

この項では、XLAエラーの処理方法について説明します。ODBCエラーの処理方法については、「エラーのチェック」を参照してください。

XLA関数のリターン・コードがSQL_SUCCESSでない場合は、ttXlaError 関数を使用して、XLAハンドルでXLA固有のエラーを取得します。

例3.17

たとえば、ttXlaTableByNameなどのXLA関数をコールした後、リターン・コードがSQL_SUCCESSであるかどうかを確認できます。SQL_SUCCESSではない場合は、XLAエラー処理関数をコールしてアプリケーションを終了できます。

rc = ttXlaTableByName(xla_handle, TABLE_OWNER, TABLE_NAME,

                      &SYSTEM_TABLE_ID, &userID);

if (rc != SQL_SUCCESS) {

  handleXLAerror (rc, xla_handle, err_buf, &native_error);

  fprintf(stderr,

    "ttXlaTableByName() returns an error <%d>: %s", rc, err_buf);

  TerminateGracefully(1);

}

XLAエラー処理関数は、エラー・スタックからすべてのXLAエラーが読み取られるまで繰り返ttXlaError をコールします(ttXlaError からのリターン・コードはSQL_NO_DATA_FOUNDです)。エラーを再度読み取る必要がある場合は、ttXlaErrorRestart関数をコールしてエラー・スタックのポインタを最初のエラーにリセットします。

エラー・スタックは、ttXlaErrorまたはttXlaErrorRestart以外のすべてのXLA関数へのコール後に消去されます。


注意: ttXlaOpenTimesTen およびttXlaPersistOpenでXLAハンドルを作成できない場合は、エラー・コードSQL_INVALID_HANDLEが返されます。XLAハンドルが作成されていないため、ttXlaErrorを使用してこのエラーを検出することはできません。SQL_INVALID_HANDLEは、メモリーが割り当てることができない場合または指定したパラメータが無効である場合にのみ返されます。

アプリケーションによっては、特定のXLAエラーに対処する必要がある場合があります。次に、それらのエラーを示します。

 tt_ErrDbAllocFailed                                  802      T

 tt_ErrCacheXlaNotRead                               5023

 tt_ErrCacheXLARollbackFailed                        5031

 tt_ErrCondLockConflict                              6001      T

 tt_ErrDeadlockVictim                                6002      T

 tt_ErrTimeoutVictim                                 6003      T

 tt_ErrPermSpaceExhausted                            6220      T

 tt_ErrTempSpaceExhausted                            6221      T

 tt_ErrBadXlaRecord                                  8024

 tt_ErrXlaBookmarkUsed                               8029

 tt_ErrXlaBookmarkBad                                8030

 tt_ErrXlaLsnBad                                     8031

 tt_ErrXlaNoSQL                                      8034

 tt_ErrXlaNoLogging                                  8035

 tt_ErrXlaParameter                                  8036

 tt_ErrXlaTableDiff                                  8037

 tt_ErrXlaTableSystem                                8038

 tt_ErrXlaTupleMismatch                              8046

 tt_ErrXlaDedicatedConnection                        8047


注意: Tでマークされているエラーは、処理を再試行したり、他の特定の処理を行って対応する一時的なエラーです。

これらのエラーを含むエラーの詳細は、『Oracle TimesTen In-Memory Databaseエラー・メッセージおよびSNMPトラップ』のエラーおよび警告のリストの項を参照してください。

例3.18

xlaSimple.cデモでは、ttXlaTableByNameなどのXLA関数をコールした後、リターン・コードがSQL_SUCCESSでない場合は、handleXLAerrorエラー処理関数をコールしてエラーを取得し、TerminateGracefully関数をコールしてアプリケーションを終了します(「XLAアプリケーションの終了」を参照)。

rc = ttXlaTableByName(xla_handle, TABLE_OWNER, TABLE_NAME,

                      &SYSTEM_TABLE_ID, &userID);

  if (rc != SQL_SUCCESS) {

    handleXLAerror (rc, xla_handle, err_buf, &native_error);

    fprintf(stderr, "ttXlaTableByName() returns an error <%d>:

            %s", rc, err_buf);

    TerminateGracefully(1);

  }

xlaSimple.cデモのhandleXLAerror 関数は、次のようになります。

void handleXLAerror(SQLRETURN rc, ttXlaHandle_h xlaHandle,

                    SQLCHAR * err_msg, SQLINTEGER * native_error)

{

#ifdef _WIN32

  long retLen;

#else

  int retLen;

#endif /* _WIN32 */

  SQLCHAR message[1024];

  SQLINTEGER code;

  char * err_msg_ptr;

  /* initialize return codes */

  rc = SQL_ERROR;

  *native_error = -1;

  err_msg[0] = '\0';

  

  err_msg_ptr = (char*) &err_msg[0];

  

  while (1)

  {

    int rc = ttXlaError(xlaHandle, &code, message,

                        sizeof(message), &retLen);

    if (rc == SQL_NO_DATA_FOUND)

    {

      break;

    }

    if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {

      sprintf(err_msg_ptr,

              "*** Error fetching error message via ttXlaError();

              rc=<%d>.",rc) ;

      break;

    }

    rc = SQL_ERROR;

    *native_error = code ;

    /* append any other error messages */

    err_msg_ptr = (char*) &err_msg[0] + strlen((char*)err_msg);

  } */ end while loop */

}