Oracle9iのSQL*Loader

マニュアルには全然載っていない構文が書けたり、そのためバグがあったりするというこの機能について格闘した結果をあとで書く。
2006/04/24ちょっと更新(スペースが上手く表現できない。)

  • ダイレクト・ロードを指定すると、NOT NULL制約がある列にNULLを入れることができる。その列にインデックスが貼られておらず、パーティションキー列でない場合は、テーブルにSELECT文やDELETE文を発行することが可能。他方、従来型ロードをした場合は、NOT NULL制約に引っかかりエラーとなる。(内部的にINSERT文を発行しているそうだ。)
  • デフォルトではdatファイルの空白はNULLとして扱われ、通常NOT NULL制約にひっかかるが、ctlファイルで空白のSQLを生成してやれば、空白を突っ込める。

LOAD DATA
APPEND INTO table1
(
column1Char POSITION(1:2) CHAR "NVL(:column1Char, ' ')"
)

  • POSITIONがdatファイルの範囲外でもエラーにはならない。

datファイルが100バイト目までしかない場合に、

LOAD DATA
APPEND INTO table1
(
column1Char POSITION(101:110) CHAR
)

という制御ファイルはエラーにはならない。NULLが入る。(ダイレクトロードのみ?)

  • ctlファイルは以下の2つともOK

LOAD DATA
APPEND INTO table1
(
...
)

LOAD DATA
INTO table1 APPEND
(
...
)