6

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 のドキュメントにリンクする必要があります。

4

2 に答える 2