【初心者向け】Oracleのローダー機能で指定したテーブルにインサートする方法(例文あり)

「csvファイルはあるけれど、insert文を1つずつ書かずにテーブルにインサートしたい」ということがあると思います。私もinsert文を1つずつ書くという初歩的なことをしていた時期がありました。3万レコードくらいあるデータをエクセルで整形してなんてこともザラでした。偉い人は指示するだけなので、「あとは自分でよろしく」みたいな感じですね。同じ状況の人は多いと思うので、csvの情報を一気にインサートする方法を紹介します。

ローダーを利用してcsvファイルの情報をテーブルにインサートする

標題が今回の目標です。ローダーと言われているものですが、正式には「SQL*Loader」というものです。以降はローダーと表記します。なお、ローダーの詳細は以下のリンクを参照願います。

 

そして必要なステップは以下です。大きくは3ステップです。

  • csvファイルを用意
  • ctlファイルを用意(制御ファイル)
  • コマンドラインで実行

csvファイルは既に準備されてると思います。csvの中身にカラムヘッダ情報が記載されていないことを前提に進めますので、もしcsvファイルにカラム名が記載されている場合は事前に取り除いて下さい。

 

ctlファイルを用意

これが今回のキモです。コントロールファイルとも呼ばれてます。データベース接続ツールが作成してくれる場合もありますが、まずは自分で作成してみましょう。制御ファイルの詳細は以下リンクを参照願いますが、ここでは少しハードルを下げて説明します。

 

基本的な制御ファイルは以下の様に記載します。

LOAD DATA
INFILE 'c:\HogeTable.csv'
BADFILE 'c:\HogeTable.bad'
APPEND INTO TABLE TABLE_HOGE
FIELDS TERMINATED BY ","
(
COLUMN1,
COLUMN2,
COLUMN3,
...
)

何だか沢山書かれてますね。でも大丈夫です。ポイントを絞って基本的な部分から押さえましょう。 まず、『LOAD DATA』はオマジナイや枕詞と考えて下さい。

 

INFILE

INFILE句と呼ばれる部分です。INFILEの後ろに挿入したいデータが入ったファイルパスを記載します。

INFILE 'c:\HogeTable.csv'

 『c:\HogeTable.csv』の部分にファイルパスを記載し、必ずシングルクォーテーションでパスの部分を囲って下さい。また、今回はcsvファイルで例文を記載していますが、datファイルでも大丈夫です。データベース接続ツールを使用してdatファイルが用意されてあるだけ!なんてことも多々ありますが、中身はテキストファイルです。

 

BADFILE

ローダーが実行された時に、挿入できなかったレコードを記載してくれるファイルです。どのレコードが拒否されたのか記載がしてあるだけなので、何が原因では記載していません。INFILE句と同じ様に、BADFILEの後ろにファイルパスを記載します。

BADFILE 'c:\HogeTable.bad'

c:\HogeTable.bad』の部分にファイルパスを記載して、これまたシングルクォーテーションでパスの部分を囲みます。中身はテキストファイルなので、エディタで開けば挿入出来なかったレコードが記載されています。

 

APPEND INTO TABLE

厳密には「APPEND」と「INTO TABLE」になっています。意味合いとしては、「既存のテーブルの情報を保持して、レコードを挿入しますよ」ということです。この「APPEND」の部分を「REPLACE」もしくは「TRUNCATE」にすることも出来ます。簡単に説明すると以下が実行されます。

  • APPEND・・・単純に挿入
  • REPLACE・・・DELETE文が実行(テーブルの既存レコードが全部消える!)
  • TRUNCATE・・・TRUNCATE文が実行(テーブルの既存レコードが全部消える!)

なので、既存レコードを保持した場合であれば、「APPEND」を指定して下さい。既存レコードは不要の場合は、「REPLACE」もしくは「TRUNCATE」を指定します。詳細は以下のリンクを参照願います。

 

FIELDS TERMINATED BY

区切り方を指定します。csvファイルを使用するので、カンマを指定します。ダブルクォーテーションでカンマを囲います。

FIELDS TERMINATED BY ","

 

フィールドの部分

いよいよ、データの部分です。カラム名を指定します。csvファイルの1レコードあたりのカラム数と同じ様に用意します。上記の例文の場合、元のcsvファイルはこんな感じになっています。

COLUMN1, COLUMN2, COLUMN3,...

制御ファイルにはカラム数と同じ数だけ、丸カッコのカラム名を記述します。上記の例文では3つ以降は省略しています。カラム数が10あればカラム名を10個記載します。

(
COLUMN1,
COLUMN2,
COLUMN3,
...
)

尚、フィールドに書いたカラム名に指定して、csvが読み込まれます。例えば以下の場合だとどうなるでしょうか。csv側は以下の様になっています。

A,B,C

制御ファイルには以下の記述を行います。カラム数は75個あるとしますが、制御ファイル側には3つのカラム名だけ指定します。

(
COLUMN1,
COLUMN50,
COLUMN75,
)

上記の記述だと、「A」という値は「COLUMN1」にインサートされますが、「B」という値は「COLUMN50」にインサートされ、「C」という値は「COLUMN75」にインサートされます。他のカラムにはnullがセットされます。つまり、not nullのカラムに対しては制御ファイルに記述が必須になります。

 

コマンドラインで実行

さて、いよいよローダーの実行です。コマンドプロンプトを起動する前に必要な情報をメモしましょう。

  • DBユーザ名
  • DBパスワード
  • DB名称(いわゆるDBNAME)
  • ローダー実行のコマンド

DBユーザ名、DBパスワード、DB名称の説明は割愛します。DB名称が不要な場合は「@DB名称」の部分を削って下さい。ローダー実行のコマンドですが、以下の様に記述します。

sqlldr DBユーザ名/DBパスワード@DB名称 control='c:\load.ctl' log='c:\result.log'

control='c:\load.ctl'』の『c:\load.ctl』の部分に制御ファイルのフルパスを記載します。パスはシングルクォーテーションで囲って下さい。『log='c:\result.log'』の『c:\result.log』はローダー実行時のログファイル出力に必要です。ログファイルには実行結果が記載されています。

上記のローダー実行文が用意出来たら、コマンドプロンプトを起動し、ローダー実行文を貼り付けてEnterキーを押下して下さい。あとは待つだけです。もし失敗した場合はログファイルにエラー内容が記載されており、badファイルに対象レコードが記載されているので、確認して修正しましょう。

 

まとめ

今回は基本的なローダーの使用方法を紹介しました。csvがあれば、あとは制御ファイルを用意するだけです。実行速度の高速化やちょっと複雑な方法もあるので、別の機会に紹介しようと思います。