Webサイト制作コースのお申し込みはこちら Webサイト制作コースのお申し込みはこちら

Oracleのデータインポートユーティリティ、SQL*Loaderについてまとめています。

SQL*Loaderは、Oracleにデータをインポートするためのユーティリティ

ファイル構造を定義することで、多彩なフォーマットのファイルインポートが可能です。実行するには、sqlldrコマンドを使用します。例えば以下のコマンドは、ユーザID scottを使用して、def.ctlというファイル構造定義ファイルを指定して、データのインポートをおこないます。実行時のログは、Import.logファイルに出力します。

sqlldr USERID=scott CONTROL=def.ctl LOG=import.log

SQL DeveloperにもSQL*Loader形式でエクスポートするオプションが用意されています。

【関連記事】
SQL Developerを使ってみよう!資格取得の学習にも使える便利なツール

SQL*Loader制御ファイルで、データの構造を指定する

SQL Loaderを使うことで、たとえばメインフレーム系から出力したデータファイルを容易にOracleに取り込むなど、他システムとの連携が簡単になります。

以下は固定長を指定する場合の制御ファイルです。ファイルexample.datを11桁の固定長データとして、テーブル名exampleに取り込みます。

load data
infile 'example.dat'  "fix 11"
into table example
fields terminated by ',' optionally enclosed by '"'
(col1, col2)

example.dat:
396,...ty,.4922,beth,\n
68773,ben,.
1,.."dave",
5455,mike,.

カンマで区切られたデータを、第一カラム、第二カラムとしてロードします。1行目は、ty,.までが11バイトで、以降は2行目として扱われます。

以下は、可変長を指定する制御ファイルです。ファイルexample.datを最初の3バイトでレコード長を決めています。

1行目は、レコード長9バイトで「hello」と「cd」、レコード長10バイトで「world」と「im(+1バイトの改行文字)」、2行目は12バイトで「my」と「name is(+1バイトの改行文字)」となります。

load data
infile 'example.dat'  "var 3"
into table example
fields terminated by ',' optionally enclosed by '"'
(col1 char(5),
 col2 char(7))

example.dat:
009hello,cd,010world,im,
012my,name is,

以下は、ストリーム・レコード形式の制御ファイルです。終了文字が出現することで1つのレコードとして認識します。以下の例は、ファイルexample.datに「|(+改行文字)」が出現したら1レコードとみなす例です。1行目では「hello」と「world」、2行目では「james」と「bond」がそれぞれcol1とcol2に入ります。

load data
infile 'example.dat'  "str '|\n'"
into table example
fields terminated by ',' optionally enclosed by '"'
(col1 char(5),
 col2 char(7))

example.dat:
hello,world,|
james,bond,|

参考)Oracle 公式ドキュメント SQL*Loaderの概念

バイナリ形式をロードするための制御ファイル

カンマなどのデリミタ文字を使わず、レコード先頭からのバイト数でカラムを定義することもでき、バイナリファイルを扱う際に有効です。

以下の制御ファイルは、ファイルsample.datから対応するデータの物理位置を指定し、テーブルdepartmentsに対応するカラムのデータをロードします。dept_mgrはCOLUMN OBJECTでname、age、emp_idで構成されています。

LOAD DATA
INFILE 'sample.dat'
INTO TABLE departments
   (dept_no     POSITION(01:03)    CHAR,
    dept_name   POSITION(05:15)    CHAR,
1   dept_mgr    COLUMN OBJECT
      (name     POSITION(17:33)    CHAR,
       age      POSITION(35:37)    INTEGER EXTERNAL,
       emp_id   POSITION(40:46)    INTEGER EXTERNAL) )

データ・ファイル(sample.dat)
101 Mathematics  Johny Quest       30   1024
237 Physics      Albert Einstein   65   0000

参考)Oracle公式ドキュメント オブジェクト、LOBおよびコレクションのロード

制御ファイルとOracleによるデータフォーマットのチェック

SQL*Loaderの制御ファイルに沿わないデータは拒否されます。例えば、デリミタで区切られたあるべきフィールドが存在しない場合、フィールドがカラム定義で指定した最大長を超えている場合などです。拒否されたレコードは不良ファイル(拡張子.bad)に書き込まれます。

続いて、Oracle Databaseの表に行として挿入される際に、不適切なデータは拒否されます。データ型やデータ長が異なったり、SQL*Loaderの制御ファイル定義がOracle Databaseとマッチしていなかった場合、キーが重複している場合、NULL不可フィールドがNULLの場合などがこれにあたります。

なお、Oracle Databaseに拒否されたデータも不良ファイルに書き込まれます。

外部表を使ったロードとSQL*Loaderの違い

SQL*Loaderで直接データベースにデータをインポートせず、外部表を使ってインポートすることが可能です。外部表は、データベース上には存在しないが実在のテーブルのように見えます。データへのアクセスは、ORACLE_LOADER、OACLE_DATAPUMPといったアクセスドライバを利用しておこないます。

外部表の最大のメリットは、パラレル処理が可能なことで大きなファイルをロードする際の時間短縮に有効です。ただし、SJIS、EUCコードのデータの場合、パラレル処理ができないという制約があります。

SQL*Loaderにはパラレル処理機能はありませんが、ファイルを分割することでパラレル処理の実現が可能です。

使い分けとしては、バッチ処理などに組み込む定常的な処理は外部表ロードを使い、定常的なローディング処理には手早く対応できるSQL*Loaderを使うのが有効です。

まとめ

ポテパンダの一言メモ
  • SQL*Loaderは、ファイルを制御ファイルで構造定義してデータベースにロードするユーティリティ
  • 制御ファイルの記述によって、固定長、可変長、終了文字を使ったストリームレコード形式、バイナリ形式のファイルが扱える
  • SQL*Loaderをバッチ処理などに組み込むことも可能だが、大量データは外部表を使ったロードの方が速い

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。