小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


Oracle SQL*Loaderを使ったデータ挿入の方法

f:id:replication:20140601004631j:plain
photo credit: Sprengben [why not get a friend] via photopin cc

はじめに

SQL*Loaderは、CSVファイルからデータを読み取って、テーブルにデータを挿入するツールです。大量のデータをテーブルに挿入する際、ループ文を使ってinsert文を何度も発行するより、高速にデータ挿入が可能です。

OracleのSQL*Loaderを使ってテーブルにデータを挿入してみました。

新・門外不出のOracle現場ワザ エキスパートが明かす運用・管理の極意 (DB Selection)
小田 圭二 大塚 信男 五十嵐 建平 谷 敦雄 宮崎 博之 神田 達成 村方 仁
翔泳社
売り上げランキング: 49,432

Oracleのバージョン
  • Oracle Database 11g Release 11.2.0.1.0
テスト用のテーブル(table01)
名前       Null     タイプ          
 -------- -------- ------------ 
ID         NOT NULL  NUMBER       
NAME                 VARCHAR2(50) 
FURIGANA             VARCHAR2(50) 
制御ファイル(table01.ctl)

SQL*Loaderを使うには、制御ファイル(.ctl)というファイルを作らなければなりません。

OPTIONS(ROWS=1000,DIRECT=TRUE)
LOAD DATA
INFILE 'C:\Users\Administrator\Desktop\work\input.csv'
BADFILE 'C:\Users\Administrator\Desktop\work\failedRecord.csv'
APPEND
INTO TABLE table01
FIELDS TERMINATED BY ","
OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
 ID,
 NAME,
 FURIGANA
)

簡単に項目の意味を説明すると、

OPTIONS SQL*Loaderのオプションを指定します。ROWS=1000で1000件単位でコミットするよう指定しています。DIRECT=TRUEを指定することで、ダイレクトパスインサートと呼ばれる高速な挿入が行われます。
INFILE 入力となるCSVファイルパスを指定します。
BADFILE エラーとなったレコードが記録されるファイルを指定します。
FIELDS TERMINATED CSVファイルの区切り文字を指定します。(カンマ区切り)
OPTIONALLY ENCLOSED データを囲む文字を指定します。(ダブルクウォート)
TRAILING NULLCOLS データの無い項目にNULLを入れるようになります。
CSVファイル(input.csv)

以下のようなCSVファイルを用意します。4レコード目だけは意図的に主キーを空にしてエラーを発生させます。

1,"山田 太郎","やまだ たろう"
2,"田中 太郎","たなか たろう"
3,"鈴木 太郎",""
,"斉藤 太郎","さいとう たろう"
SQL*Loaderの使い方

制御ファイルやCSVファイルを所定のディレクトリに格納します。今回は、C:\Users\Administrator\Desktop\workにしています。
f:id:replication:20140601010326p:plain
以下のコマンドでSQL*Loaderを実行します。

sqlldr userid=ユーザID/パスワード@サービス名 control=table01.ctl log=table01.log

>>SQL*Loader: Release 11.2.0.1.0 - Production on61 00:41:13 2014
>>Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

>>ロードは完了しました。 - 論理レコード件数4
ログを確認する(table01.log)

log=table01.logで指定したログファイルに実行結果が出力されます。
意図的に4レコード目のみ、主キーを空にしているためデータエラーが検出されています。
f:id:replication:20140601010240p:plain

おわりに

SQL*Loaderは、思ったよりも手軽に使えます。
CSVファイルを作るところが機械的にできれば、大量データの挿入も簡単に処理できそうです。