====== Oracle SQL∗Loader ======
CSVファイルなどから、Oracleへデータを流し込むツール\\
CSVや固定長の**データファイル**と、データファイルのロードに関する設定を記述した**コントロールファイル**を準備する。\\
===== コントロールファイル =====
コントロールファイルに記述する各種設定は、必要なもののみ記述し、不要なものは記述しない。\\
==== 主な項目 ====
* **options**\\ 読み込み時の設定を記述。load dataよりも前に書かれるのは、これだけと思われる。
* **load**\\ ロードするレコード数
* **-1**の場合、全て
* **skip**\\ スキップするレコード数
* **-1**の場合、429497295(0xffffffff)
* **errors**\\ 許容するエラー数
* **-1**の場合、全て
* **rows**\\ 何件ごとにコミットを行うかの行数
* **-1**の場合、429497295(0xffffffff)
* **load data**\\ ほぼお約束の記述。
* **infile**\\ 入力対象となるデータファイルを指定する。
* **badfile**\\ 何らかのエラーにより、Oracleへの投入に失敗したデータがあると、ここで指定したファイルに出力される。
* //<投入モード>//\\ データの入力時のモード
* **insert**\\ データは新規でロードされる。テーブルは空である事が前提。既にデータが存在している場合、それが重複しないデータであってもエラーとなる。
* **append**\\ データを追加でロードする。既にデータがある場合は、duplicateしないデータのみ追加される。
* **replace**\\ 既にテーブルにある全レコードを削除して、新規にデータをロードする。削除方法はdelete文での削除に相当する。
* **truncate**\\ replaceと同じ。ただし削除はtruncateに相当する。
* **into table**\\ データの投入先のテーブルを指定する
* **when**\\ データの投入条件を指定する。where句と似た書き方をするが、比較演算子として**=**,**<>**,**!=**および**AND**しか使用できない。
* **fields //<設定値>//**\\ データの投入対象の列を指定する。
* **terminated by //<区切り文字>//**\\ データの区切り文字を指定する。
* **カンマ区切り**\\ terminated by ","
* **タブ区切り**\\ terminated by X'09'\\ terminated by ' ' ←シングルクォートの間はタブ
* **optionally enclosed by //<囲み記号>//**\\ データを囲む記号がある場合に指定する。
* **ダブルクォートで括る場合**\\ optionally enclosed by '"'
* **(//<項目名>//,//<項目名>//,…)**\\ データ投入先テーブルの項目名を列挙する。データファイル内の並び順に合わせて列挙する。
===== 例 =====
* **データ入替**\\ テーブルHOGEの内容を一旦すべて削除した後、/home/hogehoge/foobar.txtの内容を投入する。
load data
infile '/home/hogehoge/foobar.txt'
replace
into table HOGE
fields terminated by ' '
(hoge_cd, hoge_name, hoge_flg)
===== 環境変数 =====
実際にsqlldrコマンドを使用する時には、実行するユーザの環境変数を正しく宣言しておかないとうまく入らない。\\
実行用のシェルスクリプトなどを準備しておいて、
#!/bin/sh
export ORACLE_HOME=/oracle/app/oracle/product/x.x.x
export LD_LIBRARY_PATH=/oracle/app/oracle/product/x.x.x/lib
export PATH=/oracle/app/oracle/product/x.x.x/bin
export NLS_LANG=Japanese_Japan.JA16SJIS
sqlldr {ID}/{PASS} control='{コントロールファイルのパス}'
といった具合で。\\
oracle用のユーザで実行する分にはだいたいちゃんとなっていると思うので、**NLS_LANG**をDBの文字コードと合わせておいて、投入するデータファイルの文字コードも統一しておけば多分すんなり入る。