Sql Loaderで読み込みをしたところ最終列が空白の行の場合に、列が見つかりませんでしたというエラーが出た。
環境:Oracle 11g
※環境が手元にないのでコードは未テストです。
エラーの内容
以下のようなCSVをSQL Loaderにて取り込むと下記のエラーが出る。
3行目の4列目は空文字
sample.csv
列A,列B,列C,列D
A1,B1,C1,D1
A2,B2,C2,D2
A3,B3,C3,
テーブルの定義
sampleTable
列A 列B 列C 列D
「拒否されました。- 表テーブル名,列列Dでエラーが発生しました。
論理レコードが終了する前に列が見つかりませんでした。(TRAILING NULLCOLSを使用)」
原因
CSVのデータを読み取りそれをテーブルの列にマッピングしているらしい。
上記のエラーはつまり列Dに対応するCSVのデータが見つからなかったということを言っている。
解決法
TRAILING NULLCOLSとNVLを使うことで列として認識させることができた。CTLファイルは下記のような感じ。
sample.CTL
省略
FIELDS TERMINATED BY "," TRAILING NULLCOLS
(
列A "NVL(:列A, ' ')"
,列B "NVL(:列B, ' ')"
,列C "NVL(:列C, ' ')"
,列D "NVL(:列D, ' ')"
)
TRAILING NULLCOLSで空文字の列でもNULLの値が読み取られるようになり、NULLがNVLで' 'に変わるという仕組みになっている。