以下のエラー事象が発生した場合は、データベースの切り替えが発生した可能性があります。この場合、コネクションの再接続を行って、トランザクションを再実行してください。
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 { /* 再接続失敗 */ } }