===概要===
*[http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19211-01/part_ldr.html#113 SQL*Loader]を使用して、外部ファイルのデータをOracleデータベースの表にロードできる
*一般的なSQL一般的な[[SQL]]*Loaderセッションでは、SQLLoaderセッションでは、[[SQL]]*Loaderの動作を制御する制御ファイルと1つ以上のデータ・ファイルが入力用に使用される*SQL*Loaderの出力先は、データがロードされるOracleデータベース、ログ・ファイル、不良ファイルで、廃棄ファイルに出力される場合もあるLoaderの出力先は、データがロードされる[[Oracle]]データベース、ログ・ファイル、不良ファイルで、廃棄ファイルに出力される場合もある
[[File:0953_ora_sqlldr01.jpg]]
===[[SQL]]*Loaderのパラメータ===*[[SQL]]*Loaderは、sqlldrコマンドを指定すると起動します。また、オプションで、セッション特性を確立するパラメータを指定した場合も起動します。
*常に、値がほとんど変らない同じパラメータを使用する場合は、コマンドラインではなく、次の方法でパラメータを指定すると効率的
**パラメータ・ファイルとしてグループ化。その後、PARFILEパラメータを使用して、そのパラメータ・ファイルの名前をコマンドラインで指定。パラメータ・ファイルとしてグループ化。その後、PA[[R]]FILEパラメータを使用して、そのパラメータ・ファイルの名前をコマンドラインで指定。
**一部のパラメータは、OPTIONS句を使用して、制御ファイル内に指定。
|-
|従来型パス・ロード
|データベースの表に対して(1つ以上の)SQL データベースの表に対して(1つ以上の)[[SQL]] INSERT文が実行されます
|-
|ダイレクト・パス・ロード
====従来型パス・ロード====
*従来型パス・ロード(デフォルト)では、SQL 従来型パス・ロード(デフォルト)では、[[SQL]] INSERT文とバインド配列バッファを使用して、データをデータベース表にロード
*バッファ・リソースに関して他のすべてのプロセスと同等の処理が行われるため、競合が発生
*SQL文が生成され、 Oracleに渡されてから実行されるため、オーバーヘッドが発生[[Oracle]]に渡されてから実行されるため、オーバーヘッドが発生*挿入が発生すると、常に、Oracleデータベースで空き領域のあるブロック(ディスク内に散在して、部分的に書込み可能なブロック)が検索され、そこにデータが書き込まれる挿入が発生すると、常に、[[Oracle]]データベースで空き領域のあるブロック(ディスク内に散在して、部分的に書込み可能なブロック)が検索され、そこにデータが書き込まれる
*大量データのロード速度を大幅に低下させることがあります。
====ダイレクト・パス・ロード====
*バインド配列バッファに書き込むかわりに、SQL INSERT文を使用して、バインド配列をOracleデータベースに渡す。INSERT文を使用して、バインド配列を[[Oracle]]データベースに渡す。
*ダイレクト・パス・ロードは、ダイレクト・パスAPIを使用して、ロードされるデータをサーバーのロード・エンジンに渡す。
*ロード・エンジンは、渡されたデータから列配列構造体を作成
*ロード・エンジンは、列配列構造体を使用してOracleデータ・ブロックをフォーマットし、索引キーを作成します。新しくフォーマットされたデータベース・ブロックを直接データベースに書き込むロード・エンジンは、列配列構造体を使用して[[Oracle]]データ・ブロックをフォーマットし、索引キーを作成します。新しくフォーマットされたデータベース・ブロックを直接データベースに書き込む
*I/Oを伴う処理がオーバーラップするため、ロード・パフォーマンスが向上。
=====ダイレクト・パス・ロードの指定=====
*[[SQL]]*Loaderをダイレクト・パス・ロード・モードで起動するには、次の形式で、コマンドラインまたはパラメータ・ファイル(使用している場合)のDIRECTパラメータにtrueを設定します。
DIRECTDI[[R]]ECT=true===[[SQL]]*Loader制御ファイル===*制御ファイルは、SQL制御ファイルは、[[SQL]]*Loaderが解釈できる言語で記述されたテキスト・ファイル
====3つのセクション====
{|class="wikitable"
=====[http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19211-01/ldr_field_list.html#10225 TERMINATED FIELD]=====
*フィールドの開始位置から最初のデリミタ文字までのデータが読み込まれます
*TERMINATED TE[[R]]MINATED BY WHITESPACEを指定すると、最初に空白文字(スペース、タブ、空白、LF、改ページまたは改行)が現れるまでデータが読み込まれます
TERMINATED [BY] { WHITESPACE | X'hexstr' | 'string' | EOF }
ENCLOSED [ X'hexstr' BY] [ 'string' | X'hexstr' ] [AND] [ 'string' ]
TERMINATED TE[[R]]MINATED BY ',' a data string,
ENCLOSED BY '"' "a data string"
TERMINATED TE[[R]]MINATED BY ',' ENCLOSED BY '"' "a data string",
ENCLOSED BY '(' AND ')' (a data string)
===入力データおよびデータ・ファイル===
*制御ファイルに指定された1つ以上のファイルなどから、SQL制御ファイルに指定された1つ以上のファイルなどから、[[SQL]]*Loaderにデータが読み込まれます
*レコード形式は、INFILEパラメータを使用して制御ファイルに指定することができる。デフォルトはストリーム・レコード形式
INFILE datafile_name ["str terminator_string"]
===[[SQL]]*Loaderの事例===*Oracle Databaseのインストール時に、[[Database]]のインストール時に、$ORACLE_HOME/rdbms/demoディレクトリに事例ファイルがインストールされる
=====通常、各事例は次の種類のファイルで構成=====
====テーブルの作成====
*適当にテーブルを作成する
[[SQL]]> show user
ユーザーは"EXAM"です。
[[SQL]]> create table apache_access_log (
2 ip_address char(20) ,
3 user_inf char(20) ,
badfile 'access_log.bad' -- 拒否レコードが書き込まれるファイル名
discardfile 'access_log.dsc' -- 廃棄レコードが書き込まれるファイル名
insert -- すでにデータが存在する場合のオプション APPEND,REPLACE[[R]]EPLACE,TRUNCATET[[R]]UNCATE
into table exam.apache_access_log --
( ip_address position(*) char terminated by whitespace
$sqlldr exam/abc123 apache_access_log.ctl
[[SQL]]*Loader: Release 10.2.0.1.0 - Production on Sat Jul 11 22:05:04 2009
Copyright (c) 1982, 2005, [[Oracle]]. All rights reserved.
Commit point reached - logical record count 64
$ sqlldr exam/abc123 apache_access_log.ctl direct=true
[[SQL]]*Loader: Release 10.2.0.1.0 - Production on Sun Jul 12 00:18:28 2009
Copyright (c) 1982, 2005, [[Oracle]]. All rights reserved.
Load completed - logical record count 5872.