OCIErrorGet()
複数のエラーを返す可能性があることが文書化されているため、次のメソッドで抽出するために使用しますがOCI_SUCCESS_WITH_INFO
、現在は ではありませんOCI_ERROR
。
void check_error( sword status )
{
switch( status ) {
case OCI_SUCCESS:
break;
case OCI_SUCCESS_WITH_INFO:
{
ub4 recordno = 1;
while( status != OCI_NO_DATA ) {
sb4 errcode = 0;
text errbuf[ 1024 ];
status = ::OCIErrorGet( m_err, recordno, (text*)NULL, &errcode, errbuf, sizeof( errbuf ), OCI_HTYPE_ERROR );
if( status == OCI_SUCCESS ) {
std::cout << "oracle info: " << (const char*)errbuf << std::endl;
}
else {
assert( status == OCI_NO_DATA );
}
++recordno;
}
}
break;
case OCI_ERROR:
{
sb4 errcode = 0;
text errbuf[ 1024 ];
// note here: no check of returned value from OCIErrorCode(), no loop!
::OCIErrorGet( m_err, 1, (text*)NULL, &errcode, errbuf, sizeof( errbuf ), OCI_HTYPE_ERROR );
throw my_oracle_error( errcode, (const char*)errbuf );
}
break;
default:
throw "something else";
}
}
(もちろん、実際のコードは少し異なりますが、重要な部分は上に示されています)。
OCI_ERROR
(上記のコードでコメントでマークされている)の場合、私の質問は次のとおりです。
- 同様のループが必要ですか、それともその場合に単一のエラーのみが返されることを Oracle が保証/文書化しますか?
- その場合、戻り値を確認する必要があり
OCIErrorGet()
ますか? - 複数のエラーが返される可能性がある場合、
errcode
スローする例外にはどれを使用すればよいですか?
できれば、回答は Oracle のドキュメントにリンクする必要があります。