以下のエラー事象が発生した場合は、データベースの切り替えが発生した可能性があります。この場合、コネクションの再接続を行って、トランザクションを再実行してください。
SQLSTATEに"57P01"が返却される。
SQLSTATEに"57P02"が返却される。
SQLSTATEに"YE000"が返却される。
SQLSTATEに"26000"が返却される。
EXEC SQL CONNECT TO ~ AS CON1 ~;
EXEC SQL WHENEVER SQLERROR GOTO ERROR;
…
EXEC SQL ~;
ERROR:
if (memcmp(SQLSTATE, "57P01", 5) == 0 ||
memcmp(SQLSTATE, "57P02", 5) == 0 ||
memcmp(SQLSTATE, "YE000", 5) == 0 ||
memcmp(SQLSTATE, "26000", 5) == 0 )
{
if (ECPGget_PGconn("CON1"))
{
EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL DISCONNECT CON1;
}
/* 再接続処理へ */
}
注意
データベースの切り替えが完了するまでは、コネクションの接続がエラー終了し、SQLSTATEに"08001"を返却します。
5秒間隔で20回、再接続をリトライする場合。
int count=0;
…
RETRY:
count++;
EXEC SQL WHENEVER SQLERROR GOTO CON_ERROR;
EXEC SQL CONNECT TO ~ AS CON1 ~;
/* 再接続完了 */
CON_ERROR:
if (memcmp(SQLSTATE, "08001", 5) == 0 )
{
if (count < 20) {
#if defined(WIN32)
Sleep(5000);
#else
sleep(5);
#endif
goto RETRY;
}
else {
/* 再接続失敗 */
}
}