SQL*Loaderで、テーブル側にはあるがCSVファイルには無い列を読み飛ばして(値を設定せずに)ロードするサンプルです。
前提
以下のCSVファイルから、以下のテーブルにロードします。
テーブルには「登録日時」列がありますが、CSVファイル側にはこの列に対応するデータがありません。
- (商品マスタ.csv)
- 商品コード,商品名,単価,適用日 1001,みかん,30,2021/1/1 1002,りんご,100,2021/1/2 1003,バナナ,200,2021/1/3
| 列名 | 型 |
|---|---|
| CD | CHAR(4) |
| NAME | VARCHAR2(20) |
| PRICE | NUMBER(5,0) |
| TEKIYO | DATE |
| TOROKUBI | DATE DEFAULT SYSDATE |
「TOROKUBI」(登録日時)列には、あらかじめDEFAULTでSYSDATEが設定されています。CSVファイル側にはこの列に対応するデータはありません。
サンプル
制御ファイル(ctlファイル)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
OPTIONS (SKIP=1) --1行目は取り込まない(タイトル行のため) LOAD DATA CHARACTERSET JA16SJIS --文字コードはSJIS INFILE 'C:¥商品マスタ.csv' --取り込みファイル BADFILE 'C:¥商品マスタ.bad' --batファイル TRUNCATE --テーブルをTRUNCATEしてから取り込む INTO TABLE 商品マスタ --テーブル名 FIELDS TERMINATED BY ',' --区切り文字はカンマ TRAILING NULLCOLS --データなしの場合はNULLにする ( --テーブルの列 CD, NAME, PRICE, TEKIYO --TOROKUBI列は列リストに書かず読み飛ばす ) |
実行コマンド
- 実行例
- C:¥>sqlldr usr01/usr01@db01 control=c:¥syohin.ctl log=c:¥商品マスタ.log
実行結果
| CD | NAME | PRICE | TEKIYO | TOROKUBI |
|---|---|---|---|---|
| 1001 | みかん | 30 | 2021/1/1 | 2026/8/16 |
| 1002 | りんご | 100 | 2021/1/2 | 2026/8/16 |
| 1003 | バナナ | 200 | 2021/1/3 | 2026/8/16 |
「TOROKUBI」列には、CSVファイルの値ではなく、列に設定されたDEFAULT(実行日)が自動的に入っています。
解説
- 制御ファイルの列リストに書かなかったテーブルの列は、通常のINSERT文で列を省略した場合と同じ扱いになります。列にDEFAULTが設定されていればその値が、無ければNULLが入ります。
- この方法は、CSVファイル側に無いテーブルの列を読み飛ばしたい場合に使います。テーブルには無いのにCSVファイル側に余分な列がある場合は、この方法ではなく「FILLER」を使ってファイル側の列を読み飛ばしてください。(関連記事参照)
- 読み飛ばした列(今回のTOROKUBI)に、DEFAULTも設定されておらずNOT NULL制約が付いている場合は、値が設定できずエラーになります。読み飛ばしたい列がNOT NULL制約付きの場合は、DEFAULTを設定しておくか、制御ファイル側でCONSTANT句などを使って固定値を設定してください。