SQL*Loader を用いて oracle データベース に CSVファイル を取り込む方法について調べたので、
ここでは、もっとも単純な入門編的な位置づけで記事を記載します。
SQL*Loader を利用するにあたり、準備するファイルは "CSVファイル" と "制御ファイル (コントロール・ファイル)" の 2ファイル です。
"CSVファイル" は 投入するデータそのものを記載します。
"制御ファイル (コントロール・ファイル)" は 投入元 CSVファイル と 投入先 テーブル の マッピング を定義します。
2つのファイルが準備できたら、 sqlldr
コマンド で CSVファイル を テーブル にインポートします。
目次
- 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ファイル に記載したデータが テーブル に投入されているはずです。
参考記事