因为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 的文档。