D:/

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 3

Windows NTの場合、終了コードは次のようになります。
EX_SUCC 0
EX_WARN 2
EX_FAIL 3
EX_FTL 4

SQL*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

*1:明らかに誤記っぽいところもあるけれど、そのまま引用

*2:Oracle10g,11gでまだ試していないが、同じようになるのでは…