Oracle12CからはSQL*Loaderのエクスプレス・モードを使用してコントロールファイルを作らずにデータをロードすることができるようです。
この機能は、表の列がすべて文字列、数値または日付型で、入力ファイルにデリミタ付きの文字列データが含まれている場合(例えばCSVファイル)に、テーブル名の指定のみでロードが実行できます。
エクスプレスモードの例
テーブル定義
主キーと属性1つづつのシンプルなテーブルで試してみます。
SQL> desc users;
Name Null? Type
----------------------------------------- -------- ----------------------------
USER_ID NOT NULL NUMBER(10)
NAME VARCHAR2(100 CHAR)
CSVファイルの内容
データが5行のCSVファイルです。
1,user1
2,user2
3,user3
4,user4
5,user5
実行結果
実行結果の標準出力内容です。5行のロードが正常に終わっていることがわかります。
実行時には、接続情報をテーブル名のみを与えるのみで、コントロールファイルは作成していません。
入力ファイルを指定しない場合、デフォルトでは「テーブル名.dat」となります。今回の場合は、「users.dat」が入力ファイルとなります。
$ sqlldr hoge/hoge@orcl TABLE=users
SQL*Loader: Release 12.1.0.2.0 - Production on Sat Jun 27 10:49:48 2015
Copyright (c) 1982, 2014, Oracle and/or its affiliates. All rights reserved.
Express Mode Load, Table: USERS
Path used: External Table, DEGREE_OF_PARALLELISM=AUTO
Table USERS:
5 Rows successfully loaded.
Check the log files:
users.log
users_%p.log_xt
for more information about the load.
テーブルにも5レコード格納されています。
SQL> r
1* select * from users
USER_ID NAME
---------- -------------------------
1 user1
2 user2
3 user3
4 user4
5 user5
どんな定義でロードされるの?
実行時の定義(コントロールファイルの内容)は、実行ログから確認できます。
今回の場合は、以下の定義でロードされています。
OPTIONS(EXTERNAL_TABLE=EXECUTE, TRIM=LRTRIM)
LOAD DATA
INFILE 'users'
APPEND
INTO TABLE USERS
FIELDS TERMINATED BY ","
(
USER_ID,
NAME CHAR(400)
)
デフォルト値の上書き方法
デフォルト値はコマンドラインパラメータで上書きします。例えば、フィールドの区切り文字をデフォルトのカンマ(,)から縦棒(|)に変更したい場合には以下のようにします。
sqlldr hoge/hoge@orcl TABLE=users TERMINATED_BY='|'
変更できる項目はマニュアルで参照できます。