SQL*Loader を用いて oracle データベース に CSVファイル を取り込む方法について調べたので、 ここでは、もっとも単純な入門編的な位置づけで記事を記載します。
SQL*Loader を利用するにあたり、準備するファイルは "CSVファイル" と "制御ファイル (コントロール・ファイル)" の 2ファイル です。
"CSVファイル" は 投入するデータそのものを記載します。
"制御ファイル (コントロール・ファイル)" は 投入元 CSVファイル と 投入先 テーブル の マッピング を定義します。
2つのファイルが準備できたら、 sqlldr
コマンド で CSVファイル を テーブル にインポートします。
目次
データ投入先テーブル
今回は以下のような "DEMO"."DEPT" テーブルへ CSVデータ をインポートしたいと思います。
DEPT テーブル
No | 物理名 | データ型 | 必須 | 主キー |
---|---|---|---|---|
1 | DEPTNO | NUMBER(2, 0) | Yes | 1 |
2 | DNAME | VARCHAR2(14) | ||
3 | LOC | VARCHAR2(13) |
CREATE TABLE "DEMO"."DEPT" ( "DEPTNO" NUMBER(2,0), "DNAME" VARCHAR2(14), "LOC" VARCHAR2(13), PRIMARY KEY ("DEPTNO") )
CSVファイル の 準備
CSVファイルは、テーブルへ投入するデータそのものになります。 今回は、1行目にヘッダーとして列名を表記し、2行目以降に実データを記載するようにしました。 ここではテストなので投入データを1件しか記載していませんが、複数行記載すれば一度に大量のデータを投入できます。
dept.csv
DEPTNO,DNAME,LOC 50,HUMAN RESOURCE,NEW YOURK
制御ファイル (コントロール・ファイル) の 準備
投入元 CSVファイル と、投入先 テーブル のマッピングを記載します。
dept.ctl
OPTIONS(LOAD=1,SKIP=1,ERRORS=-1,ROWS=1) LOAD DATA INFILE 'dept.csv' BADFILE 'dept.bad' APPEND INTO TABLE DEPT FIELDS TERMINATED BY "," TRAILING NULLCOLS ( DEPTNO, DNAME, LOC )
制御ファイル (コントロール・ファイル) で指定できる内容は奥が深そうなので、別記事にしたいと思います。 ここでは、その一部に関して解説を記載します。
- OPTIONS(... SKIP=1, ...)
- 1行目をスキップするよう指定します。
- INTO TABLE DEPT
- "DEPT"テーブルへ投入します。
- 9-13行目
- 「CSVファイルの列」と「投入先のカラム」をマッピングします。
テーブル へ データ投入 の 実行
作成した CSVファイル と 制御ファイル (コントロール・ファイル) を同一ディレクトリに配置してある前提で、 コマンドプロンプトを起動し、以下のコマンドを実行します。 ここでは、ユーザーID、パスワード、SIDが DEMO/DEMO@xe となっていますが、任意に読み替えてください。
> sqlldr DEMO/DEMO@xe control=dept.ctl
何も問題がなければ、CSVファイル に記載したデータが テーブル に投入されているはずです。
参考記事
- オラクルエンジニア通信 - 技術資料、マニュアル、セミナー - SQL*Loaderの使い方~CSV等を高速に取り込む
- SQL*Loaderメモ(Hishidama's sqlloader for Oracle9i Memo)
最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!