[Oracle] Windows環境でのimpコマンドの終了コードのハンドリング | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

Windows環境でインポートを行う場合、impコマンドをバッチファイルなどに組み込んで利用することがあります。


この時、インポートの成否によって以降の処理を分岐したい場合はOSの終了コードによって判断することができます。


例えば、以下のようなバッチファイルを作成した場合、

ECHO OFF
imp "scottie/tiger FILE=EXP.DMP IGNORE=y FROMUSER=SCOTT TOUSER=SCOTTIE LOG=imp.log
IF ERRORLEVEL 1 GOTO IMPORT_ERROR
GOTO END_LABEL

:IMPORT_ERROR
ECHO インポートに失敗しました。
GOTO END_LABEL

:END_LABEL
PAUSE


インポートでエラーが発生すると”インポートに失敗しました。”というメッセージが出力されます。


Windowsの場合、impコマンドから返される終了コードはマニュアルなどには記載されていませんが、試してみると以下のとおりとなっています。

完了メッセージ Windowsの終了コード
インポートは警告なしで正常終了しました。 0
インポートは正常に終了しましたが、警告が発生しました。 1
エラーが発生したためインポートを終了します。 3

上記のバッチファイルでは、エラーまたは警告の場合に、”失敗”と判断していることになります。

ただ、インポートを実行した際、権限やオブジェクトの内容が正しいにもかかわらず以下のようなエラーが発生することがあります。

IMP-00041: 警告: オブジェクト作成の際、コンパイル・エラーが発生しました。


これはオブジェクトによって依存関係が考慮されずにインポートされることがあるためで、ユーザー定義ファンクションを使用したビューのインポート時などに発生します。

(ファンクションよりもビューが先にインポートされるため)

この時、インポートは

”インポートは正常に終了しましたが、警告が発生しました。”


という完了メッセージ(終了コード=1)で完了するのですが、この警告はインポート後に該当するオブジェクトを再コンパイルすれば解決します。

そのため、警告が発生しても”成功”と見なしたい場合もあるでしょう。


そのような場合には、以下のように終了コードが3以上であれば”失敗”としてやればOKです。

ECHO OFF
imp "scottie/tiger FILE=EXP.DMP IGNORE=y FROMUSER=SCOTT TOUSER=SCOTTIE LOG=imp.log
IF ERRORLEVEL 3 GOTO IMPORT_ERROR
GOTO END_LABEL

:IMPORT_ERROR
ECHO インポートに失敗しました。
GOTO END_LABEL

:END_LABEL
PAUSE