====== 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の文字コードと合わせておいて、投入するデータファイルの文字コードも統一しておけば多分すんなり入る。