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固有のエラーを取得します。
たとえば、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トラップ』のエラーおよび警告のリストの項を参照してください。
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 */
}