Windows環境でのSQLLoaderの実行結果はマニュアル通りではない
WindowsXp(Pro)&Oracle10gXE環境でSQLLoaderを実行するバッチファイルを作ったところ、マニュアルとは異なるリターンコードが返ってきたのでメモ。
Oracleのマニュアルを確認すると、*1
Oracle SQL*Loaderでは、SQL*Loaderの完了後、すぐに実行結果を確認できます。プラットフォームによっては、SQL*Loaderの実行結果はログ・ファイルに記録されるのみでなく、プロセス終了コードにも通知されます。このOracle SQL*Loaderの機能によって、コマンドラインやスクリプトからSQL*Loaderを起動したときにもその結果を確認できます。表7-1に、それぞれの結果に対応する終了コードを示します。表7-1 SQL*Loaderの終了コード
結果 終了コード すべての列が正常にロードされた EX_SUCC すべての行または一部の行が拒否された EX_WARN すべての行または一部の行が拒否された EX_WARN ロードが中断された EX_WARN コマンドラインまたは構文エラー EX_FAIL SQL*Loaderに対してリカバリ不能なOracleエラー EX_FAIL OS関連エラー(ファイルのオープン/クローズ、mallocなど) EX_FAIL UNIXの場合、終了コードは次のようになります。
EX_SUCC 0
EX_FAIL 1
EX_WARN 2
EX_FTL 3Windows NTの場合、終了コードは次のようになります。
EX_SUCC 0
EX_WARN 2
EX_FAIL 3
EX_FTL 4SQL*Loaderが0(ゼロ)以外の終了コードを返した場合、システム・ログ・ファイルおよびSQL*Loaderログ・ファイルで、詳細な診断情報を確認してください。
とあるが、EX_FAIL時のリターンコード値は実際に動かしてみると"1"が返ってくる。
◆試してみたパターンとそのリターンコード
パターン | 期待値 | 実際のリターンコード |
---|---|---|
引数に指定した制御ファイルが存在しない | 3(EX_FAIL) | 1 |
引数に指定した制御ファイルの構文が誤っている | 3(EX_FAIL) | 1 |
引数に指定したデータファイルが存在しない | 3(EX_FAIL) | 1 |
引数に指定したログファイルが読み取り専用になっている | 4(EX_FTL) | 4 |
というわけで、WINNT(WinXPPro)+Oracle10gXe環境でバッチファイルを組み、かつSQLLoaderの実行結果で後続の処理を制御する場合は、終了コードは以下のようになるので注意。*2
結果 | WINNT終了コード | |
---|---|---|
すべての列が正常にロードされた | 0 | |
すべての行または一部の行が拒否された | 2 | |
ロードが中断された | 2 | |
コマンドラインまたは構文エラー | 1 | |
SQL*Loaderに対してリカバリ不能なOracleエラー | 1 | |
OS関連エラー(ファイルのオープン/クローズ、mallocなど) | 4 |