トップ 履歴 一覧 カテゴリ ソース 検索 ヘルプ RSS ログイン

Oracle/SqlLoader

INDEX

Oracle SQL*Loader

SQL*Loader は、データファイル(CSV,TSVや固定長など)からOracleのテーブルにデータを流し込むツール。ロードするデータファイルとその構造やテーブルとの対応付けを定義した制御ファイルを用意する。

起動オブション

CONTROL=sample.ctl
使用する制御ファイルを指定する。
LOG=sample.log
実行時のログを出力するログファイルを指定する。
DIRECT=Y
ダイレクト・パスでデータをロードするとき指定する。 従来型パスに比べ驚異的なパフォーマンス(10倍近く)が出る。 ただし、制約も多いので用途・目的応じて使い分けること。

制御ファイル

制御ファイルの文字コードは環境(NLS_LANGで指定された文字コード)に合わせる。

また、各行で、"--" 以降はコメントとして扱われる。

 OPTIONS

SQL*Loader に渡す引数を記述できる。

LOAD
ロードする論理レコードの最大件数を指定する。デフォルトはすべて
SKIP
先頭から読み飛ばす論理レコード件数を指定する。デフォルトはなし(0件)
ERRORS
許容するエラーの数を指定する。指定した値を超えると中止する。(-1の場合は、無制限?)
ROWS
何件毎にコミットするかを指定する。(-1の場合は、全件コミット?)

 LOAD DATA

お約束。以降に読み込みために必要な定義(制御情報)を記述する。

 CHARACTERSET

データファイルの文字コードを指定する。

 INFILE

データファイル名を指定する。相対パスは実行時のカレントディレクトリからとなる。複数のデータファイルがある場合は、必要分をかき並べる。

また、「INFILE *」とすると対象のデータが制御ファイルの終わりにあることを示します。制御情報のあとに「BEGINDATA」を記述してデータを記述します。

 BADFILE

不良ファイル名を指定する。何らかの理由でDBへロードすることが出来なかった論理レコードが出力される。指定がない場合は、必要に応じてデフォルトのファイル名(データファイル.bad)で作成される。

 DISCARDFILE

廃棄ファイル名を指定する。WHEN条件によって弾かれた論理レコードが出力される。指定がない場合は、廃棄ファイルは作成されない。

 INSERT, APPEND, REPLACE, TRUNCATE

データをロードするモード、以下のいずれかを指定する。

INSERT
空のデータを表に追加する。テーブルが空でない場合はエラーとなる。
APPEND
表にデータを追加する。既にデータがある場合、重複しないレコードのみが追加される。
REPLACE
表のデータをすべて入れ替える。既存のデータは、DELETE してからロードされる。
TRUNCATE
表のデータを切り捨てて追加する。既存のデータは、TRUNCATE してからロードされる。TRUNCATE 出来る権限が必要となる。

 INTO TABLE table_name

データを入れる表名を指定する。

 WHEN condition

データを入れる条件を指定する。書き方は、SQLのWHERE句と同様。条件に一致しないものは、廃棄ファイルに出力される。

 FIELDS TERMINATED BY "〜" OPTIONALLY ENCLOSED BY '〜'

FIELDS
 [TERMINATED BY (WHITESPACE|X'xx'|'str'|EOF)
 [OPTIONALLY] [ENCLOSED BY (X'xx'|'str') [AND (X'xx'|'str')]

デフォルトの項目の区切り方を指定する。可変長データの区切り文字と必要なら囲み文字を指定する。固定長の場合は、項目ごとに POSITION で指定する。

  • カンマ区切りの場合は、「TERMINATED BY ","」
  • タブ区切りの場合は、「TERMINATED BY X'09'」
  • ダブルクォーテーションで囲まれている場合は、「OPTIONALLY ENCLOSED BY '"'」

 TRAILING NULLCOLS

データがない場合に、NULLを入れるように指定する。可変長で項目数が足りない場合に指定があればNULLとなるが、ない場合はエラーとなる。

 PRESERVE BLANKS

通常 SQL*Loader は、空白文字を切り捨てます。これを行わないようにするときに指定します。ただし、すべての列に対して適応されるので、TRIM関数などで不要な空白を取り除くようにします。

制御ファイル記述例

----------------------------------------------------------------------
--  Oracle SQL*Loader Control File
--
--     FileName  sample.ctl
--     MakeDate  2006/01/01 12:34:56
--     Creator   SqlSaver Ver.1.xx
----------------------------------------------------------------------
-- === execution command and option ===
-- sqlldr USER/PASS@TSN CONTROL=sample.ctl LOG=sample.log ...
----------------------------------------------------------------------
OPTIONS(ROWS=50000, ERRORS=100000000)

LOAD DATA
-- === file name specification ===
INFILE      'sample.dat' -- Data file
BADFILE     'sample.bad' -- Bad file
DISCARDFILE 'sample.dis' -- Discard file

-- === data insert table specification ===
INTO TABLE sample

-- === data insert method specification ===
--  mode is INSERT, APPEND, REPLACE, TRUNCATE
TRUNCATE

TRAILING NULLCOLS (
-- === layout definition specification ===
  :
)

----------------------------------------------------------------------
--  End Of File (sample.ctl)
----------------------------------------------------------------------

 カラム指定

-- COLNAME POSITION(   1:  10) CHAR
--abcdefghijklm... => 'abcdefghij'
-- COLNAME POSITION(   1:  10) DECIMAL EXTERNAL
-- 1234567890... => 123456789
-- COLNAME POSITION(   1:  10) ZONED(10,3)
-- 1234567890... => 123456.789
-- COLNAME POSITION(   1:  10) DATE "YYYY/MM/DD"
--2007/07/07... => 2007-07-07
-- COLNAME POSITION(   1:  10)
--
-- COLNAME CHAR TERMINATED BY ','
--カンマ区切りの項目
-- COLNAME CHAR TERMINATED BY ','  ENCLOSED BY '"' AND '"'
--カンマ区切りの項目(囲み文字あり)
-- COLNAME CHAR TERMINATED BY '\t'
--タブ区切りの項目
-- COLNAME CHAR TERMINATED BY '\t' ENCLOSED BY '"' AND '"'
--タブ区切りの項目(囲み文字あり)
-- COLNAME CONSTANT 100
--固定値で 100 をセット

 日付マスクを使用して日付データをロードする

PROC_DATE  POSITION(1,10) DATE "yyyy/mm/dd"

 SQL文字列を使用して日付データをロードする

PROC_DATE  POSITION(1,10) "TO_DATE(:PROC_DATE, 'yyyy/mm/dd')",

 SQL文字列を使用して日付データをロードする(年度項目付き)

PROC_DATE  POSITION(1,10) "TO_DATE(:PROC_DATE, 'yyyy/mm/dd')",
PROC_NENDO                "TO_CHAR( ADD_MONTHS( TO_DATE(
                          :PROC_DATE, 'yyyy/mm/dd'), -3), 'yyyy')",

 SQL文字列を使用してスペースの時NULLに置き換えて格納

PROC_DATE  POSITION(1,10) "TO_DATE(:PROC_DATE, 'yyyy/mm/dd')"
                          NULLIF PROC_DATE=BLANKS,
PROC_NENDO                NULLIF PROC_DATE=BLANKS,
                          "TO_CHAR( ADD_MONTHS( TO_DATE(
                          :PROC_DATE, 'yyyy/mm/dd'), -3), 'yyyy')",

最終更新時間:2008年11月14日 15時43分00秒 指摘や意見などあればSandBoxのBBSへ。