|
SQL*Loader 〜可変長データのローディング〜
SQL*Loader
〜可変長データのローディング〜
0.改定履歴
1.はじめに
このドキュメントは,Oracle8にて、SQL*Loaderを利用する方法の説明を行う.
今回は,可変長のカンマ区切りテキストデータをロードするテストを行う.
2.テストデータの削除
前回,「SQL*Loader 〜固定長データのローディング〜」で利用したテーブルを利用するので,テーブル内のデータを削除する.
テーブルデータの削除
SQL> select * from TestTable;
FIELD1 FIELD2 FIELD3 FIELD4 F
--------- ---------- -------- --------- -
11111 2222222222 70-10-25 100 0
22222 3333333333 62-09-26 200 0
33333 4444444444 45-05-29 300 0
SQL> delete TestTable;
3行が削除されました。
SQL> commit;
コミットが完了しました。
SQL> select * from TestTable;
レコードが選択されませんでした。
SQL>
|
テーブルが存在しない時は,「SQL*Loader 〜固定長データのローディング〜」の実習を行い作成する事.
3.可変長の制御ファイルの説明
今回対象となるのは,次のようなデータである.
data.dat
"11111","2222222222","19701025","1","7"
"22222","3333333333","19620926","2","8"
"33333","4444444444","19450529","3","9"
|
このデータは,次のような特徴がある.
- ダブルクォーテーションで,1フィールドがくくられている.
- フィールドとフィールドの間は,カンマで区切られている.
このような場合, 次のような制御ファイルとなる.
load.ctl
LOAD DATA
INFILE 'data.dat'
INSERT
INTO TABLE TestTable
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
(
FIELD1,
FIELD2,
FIELD3 "to_date(:FIELD3,'YYYYMMDD')",
FIELD4 ":FIELD4*100",
FIELD5
)
|
固定長の場合と違うのは,次のとおりである.
制御ファイルの項目説明
項目 |
説明 |
FIELDS TERMINATED BY |
フィールドとフィールドの間の区切り文字を指定する. |
OPTIONALLY ENCLOSED BY |
フィールドを囲んでいる文字を指定する. |
フィールド名 |
可変長の場合,固定長と違いデータポジションは指定しない. |
4.可変長データのロード実行
- 前節で作成したデータを用いて,SQL*Loaderを実行する.
D:\ttt>sqlldr80 scott/tiger control=load.ctl
SQL*Loader: Release 8.0.5.0.0 - Production on 日 Sep 17 23:49:21 2000
(c) Copyright 1998 Oracle Corporation. All rights reserved.
コミット・ポイントに達しました。 - 論理レコード件数:3
D:\ttt>
|
- 実行結果のログファイル(load.log)をチェックする.
SQL*Loader: Release 8.0.5.0.0 - Production on 日 Sep 17 23:49:21 2000
(c) Copyright 1998 Oracle Corporation. All rights reserved.
制御ファイル: load.ctl
データ・ファイル: data.dat
不良ファイル: data.bad
廃棄ファイル: 指定なし
(レコード拒否はいくつまでも許します。)
ロード数: ALL
読み飛ばす数: 0
許容エラー数: 50
バインド配列: 64 行、最大 65536 バイト
継続文字: 指定なし
使用パス: 従来型
表: TESTTABLE、ロード済(すべての論理レコードから)
この表に対しての有効なインサート・オプションはINSERTです。
列 名 位 置 長さ 区切 囲み データ型
------------------------------ ---------- ----- ---- ---- ---------------------
FIELD1 FIRST * , O(") CHARACTER
FIELD2 NEXT * , O(") CHARACTER
FIELD3 NEXT * , O(") CHARACTER
FIELD4 NEXT * , O(") CHARACTER
FIELD5 NEXT * , O(") CHARACTER
列: FIELD3には適用されたSQL文字列
"to_date(:FIELD3,'YYYYMMDD')"
がありました。
列: FIELD4には適用されたSQL文字列
":FIELD4*100"
がありました。
表「TESTTABLE」:
3 行ロードできました。
0 行はデータ・エラーによってロードされませんでした。
0 行はWHEN句のエラーによってロードされませんでした。
0 行件は各列が空のためロードされませんでした。
バインド配列に割り当てられた領域: 64500 バイト(50 行)
その他に割り当てられた領域: 0 バイト
読み飛ばされた論理レコードの合計: 0
読み込まれた論理レコードの合計: 3
拒否された論理レコードの合計: 0
廃棄された論理レコードの合計: 0
実行開始: 日 Sep 17 23:49:21 2000
実行終了: 日 Sep 17 23:49:22 2000
実行時間: 00:00:01.08
CPU時間 : 00:00:00.11
|
- ログを見ると,“長さ”に指定が無く,“区切”,“囲み”にオプションで指定した値が設定されていることがわかる.
- SQL*Plusにてロードしたテーブルを参照する.
SQL> select * from TestTable;
FIELD1 FIELD2 FIELD3 FIELD4 F
--------- ---------- -------- --------- -
11111 2222222222 70-10-25 100 7
22222 3333333333 62-09-26 200 8
33333 4444444444 45-05-29 300 9
SQL>
|
5.一部のフィールドをロードしない
この例では,FILED4のデータをロードしない方法を説明する.
load.ctl
LOAD DATA
INFILE 'data.dat'
INSERT
INTO TABLE TestTable
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
FIELD1,
FIELD2,
FIELD3 "to_date(:FIELD3,'YYYYMMDD')",
FIELD5
)
|
- フィールドを飛ばす事があるという指定の"TRAILING NULLCOLS"を指定する.
- フィールド定義内のFIELD4を削除する.
data.dat編集前
"11111","2222222222","19701025","1","7"
"22222","3333333333","19620926","2","8"
"33333","4444444444","19450529","3","9"
|
data.dat編集後
"11111","2222222222","19701025","7"
"22222","3333333333","19620926","8"
"33333","4444444444","19450529","9"
|
- SQL*Plusで,先程作成したデータを削除する.
SQL> delete TestTable;
3行が削除されました。
SQL> commit;
コミットが完了しました。
SQL> select * from TestTable;
レコードが選択されませんでした。
|
- SQL*Loaderを実行する.
- SQL*Plusでテーブルの内容を見る.
SQL> select * from TestTable;
FIELD1 FIELD2 FIELD3 FIELD4 F
--------- ---------- -------- --------- -
11111 2222222222 70-10-25 7
22222 3333333333 62-09-26 8
33333 4444444444 45-05-29 9
SQL>
|
- FIELD4にデータが入っていない事が確認できる.
|
|