oracle
SqlLoader

SQL*Loaderに改行コードが含まれたCSVファイルの取り込み

はじめに

自社開発のアプリケーションで、ExcelファイルのデータをCSVに変換後に内部でSQL*LoaderによりOracleの指定テーブルに登録する処理があります。登録したテーブルのデータを使用する別のアプリケーション側でエラーになったことから調査の依頼がありました。

調査

登録されたテーブルのデータを調べると、改行コードが含まれていました。テーブルのデータを条件により抽出してJSONに格納しているため、改行コードが含まれていると別の行としておかしなデータになってしまうことでエラーになることが分かりました。

このテストを行うにあたり、Excelファイルの改行コードを含めてSQL*LoaderにOracleの指定テーブルに登録しようとすると、そもそもSQL*Loader側でエラーになり登録できません。でも、現実的には改行コードが含まれて登録することができています。

先頭行の改行コード

一体何が違うのか調べてみると、先頭行に改行コードがあるとエラーになり、先頭行に改行コードが無ければ2行目以降に改行コードがあっても登録できることが分かりました。

先頭行に改行コードが無いダミーデータを登録して、後でダミーデータを削除するといいかも知れません。

最後に

UTF-8で登録しているなど他と異なるので参考になるかは分かりませんが、実体験としてあったので備忘録として書いてみました。

test.bat
SQLLDR fuga/fuga@hoge control=test.ctl errors=9999
test.ctl
LOAD DATA
CHARACTERSET AL32UTF8
INFILE 'test.csv'
APPEND
INTO TABLE TEST
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(AA,AB,AC,AD)

改行コードが含まれているデータは2重引用符で囲んでいます。

test.csv
01,K,T,1
02,"K
","T
",2

参照