UJP - 技術情報

Life is fun and easy!

不正IP報告数

Okan Sensor
 
メイン
ログイン
ブログ カテゴリ一覧

     

SQL*Loader 〜可変長データのローディング〜

SQL*Loader

〜可変長データのローディング〜


0.改定履歴

  • 2000.09.17 初版

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にデータが入っていない事が確認できる.


広告スペース
Google