photo credit: Sprengben [why not get a friend] via photopin cc
はじめに
SQL*Loaderは、CSVファイルからデータを読み取って、テーブルにデータを挿入するツールです。大量のデータをテーブルに挿入する際、ループ文を使ってinsert文を何度も発行するより、高速にデータ挿入が可能です。
OracleのSQL*Loaderを使ってテーブルにデータを挿入してみました。
新・門外不出のOracle現場ワザ エキスパートが明かす運用・管理の極意 (DB Selection)
posted with amazlet at 14.05.31
小田 圭二 大塚 信男 五十嵐 建平 谷 敦雄 宮崎 博之 神田 達成 村方 仁
翔泳社
売り上げランキング: 49,432
翔泳社
売り上げランキング: 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にしています。
以下のコマンドでSQL*Loaderを実行します。
sqlldr userid=ユーザID/パスワード@サービス名 control=table01.ctl log=table01.log >>SQL*Loader: Release 11.2.0.1.0 - Production on 日 6月 1 00:41:13 2014 >>Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved. >>ロードは完了しました。 - 論理レコード件数4
ログを確認する(table01.log)
log=table01.logで指定したログファイルに実行結果が出力されます。
意図的に4レコード目のみ、主キーを空にしているためデータエラーが検出されています。
おわりに
SQL*Loaderは、思ったよりも手軽に使えます。
CSVファイルを作るところが機械的にできれば、大量データの挿入も簡単に処理できそうです。