OracleにCSVファイルからインポート

今回のプロジェクト、DBにOracleを使ってるのに、客先からもらってきたテストデータはAccess形式だった!

とりあえずAccessからリンクさせてOracleのテーブルを参照したんだけど、テストデータをインポートしようとしたテーブルだけ、なぜかAccessから見えない。Table not foundになってしまう。

調べている時間もあまりないので、AccessからExcel形式でエクスポートし、Oracle SQL Developerでインポートしてしまおう!と思ってやってみると、どうもnullデータがうまく扱えないらしく、Exceptionが出てしまってお手上げ。

こうなったらしょうがない。SQL*Loaderを使ってコマンドラインからインポートするしかない!

ということで、普段やり慣れないSQL*Loaderを使ってのデータインポート方法をメモメモ。


まずはAccessから、csv形式でエクスポート・・・と思ったら、引数エラーとか言われてエクスポートできず。とりあえずインポートしたいデータを表示させて、コピー&ペーストでテキストエディタに貼り付けて、タブをカンマに変換してcsv変換。

次に、SQL*Loaderで使うコントロールファイルの作成。以下のような感じで作ってみました。

LOAD DATA
INFILE [csvファイル名]
APPEND
INTO TABLE [テーブル名]
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
  --ここにカラム名を列挙
)

1行目は、コントロールファイルのお約束みたいなもの。
2行目は、インポートするデータが入ったcsvファイルのファイル名。
3行目は、テーブルにデータを追加するので「APPEND」。新規に作る場合は「INSERT」で、「REPLACE/TRUNCATE」はテーブルのデータを全て削除してからデータを追加。
4行目は、インポート先テーブル名。
5行目は、csvファイルのカラム区切り記号を指定。タブ区切りの場合は「TERMINATED BY X'09'」。
6行目は、csvファイルのカラムデータを囲む文字の指定。上記の場合はダブルクォーテーションで囲っています、という意味。
7行目は、csvファイルのカラムデータが空の場合、NULLに置き換えます、という指定。
8行目以降のカッコの中に、インポート先テーブルのカラムを記述する。

コントロールファイルの作成が終わったら、後はコマンドを叩くだけ。

% sqlldr [DBユーザー名]/[DBユーザーパスワード]@[DB名] control=コントロールファイル名

実行後は、カレントディレクトリにlogファイルと、場合によってbadファイルができあがるので、必要に応じて確認する。

下手にAccessでテーブルをリンクさせて・・・なんてやるより、SQL*Loaderを使ってインポートした方が楽で早いかも。

コメント

タイトルとURLをコピーしました