SQL*Loader の 使い方

0 件のコメント

SQL*Loader を用いて oracle データベース に CSVファイル を取り込む方法について調べたので、 ここでは、もっとも単純な入門編的な位置づけで記事を記載します。

SQL*Loader を利用するにあたり、準備するファイルは "CSVファイル" と "制御ファイル (コントロール・ファイル)" の 2ファイル です。 "CSVファイル" は 投入するデータそのものを記載します。 "制御ファイル (コントロール・ファイル)" は 投入元 CSVファイル と 投入先 テーブル の マッピング を定義します。 2つのファイルが準備できたら、 sqlldr コマンド で CSVファイル を テーブル にインポートします。

目次

  1. CSVファイル の 準備
  2. 制御ファイル (コントロール・ファイル) の 準備
  3. テーブル へ データ投入 の 実行

データ投入先テーブル

今回は以下のような "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ファイル に記載したデータが テーブル に投入されているはずです。

参考記事