SQL*Loaderガイド

Oracle Master Silver

SQL*LoaderはOracleデータベースで大量データを効率的にロードするための必須ツールです。本記事では、基礎から実践的な応用、トラブルシューティング、パフォーマンス最適化まで、あらゆるニーズに応える完全ガイドを提供します。


1. SQL*Loaderとは?

SQL*Loaderは、外部ファイル(CSVや固定長ファイルなど)のデータをOracleデータベースにロードするためのツールです。以下の特徴があります:

  • 高速:大規模データも迅速にロード可能
  • 柔軟性:条件付きロードやデータ変換をサポート
  • 強力なエラー処理:エラー行や無視された行の詳細を記録

こんな場面で活躍します!

  • 外部システムからのデータ連携
  • バッチ処理での大量データ投入
  • システム移行時のデータインポート

2. SQL*Loaderの基本構成

SQL*Loaderを使用するには、以下のファイルが必要です。

ファイル種別役割
データファイルロード対象のデータを格納
制御ファイルロード方法を記述(ロード対象テーブル、データ形式、条件など)
ログファイル処理結果を記録(自動生成)
不良ファイル(.bad)エラーでロードできなかったデータを記録
破棄ファイル(.dis)条件に合わず破棄されたデータを記録

使用例:社員データのロード

ここでは、社員データをデータベースにロードする具体例を紹介します。


1. データファイル(employees.csv)

以下の内容で作成します:

1,John,Sales,5000
2,Jane,HR,5500
3,Bob,IT,6000
4,Alice,Sales,7000
[oracle@v19single ~]$ vi employees.csv  ★employees.csvを作成
[oracle@v19single ~]$ cat employees.csv
1,John,Sales,5000
2,Jane,HR,5500
3,Bob,IT,6000
4,Alice,Sales,7000
[oracle@v19single ~]$

2. 制御ファイル(employees.ctl)

制御ファイルでロード設定を記述します。

LOAD DATA
INFILE 'employees.csv'
INTO TABLE employees
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
id INTEGER EXTERNAL,
name CHAR,
department CHAR,
salary INTEGER EXTERNAL
)

解説ポイント

  • INFILE:データファイルのパス
  • FIELDS TERMINATED BY ‘,’:カンマ区切りの指定
  • TRAILING NULLCOLS:データが欠損している場合にNULLを挿入
[oracle@v19single ~]$ vi employees.ctl  ★employees.ctlを作成
[oracle@v19single ~]$ cat employees.ctl
LOAD DATA
INFILE 'employees.csv'
INTO TABLE employees
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
id INTEGER EXTERNAL,
name CHAR,
department CHAR,
salary INTEGER EXTERNAL
)
[oracle@v19single ~]$

3. テーブル作成(データベース側の準備)

以下のSQLでデータを格納するテーブルを作成します。

CREATE TABLE employees (
id NUMBER PRIMARY KEY,
name VARCHAR2(50),
department VARCHAR2(50),
salary NUMBER
);
[oracle@v19single ~]$ sqlplus user1/user1

SQL*Plus: Release 19.0.0.0.0 - Production on 火 12月 10 20:36:04 2024
Version 19.21.0.0.0

Copyright (c) 1982, 2022, Oracle. All rights reserved.



Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.21.0.0.0
に接続されました。
SQL> CREATE TABLE employees ( ★表を作成
2 id NUMBER PRIMARY KEY,
3 name VARCHAR2(50),
4 department VARCHAR2(50),
5 salary NUMBER
6 );

表が作成されました。

4. SQL*Loaderの実行

以下のコマンドでSQL*Loaderを実行します。

sqlldr userid=username/password control=employees.ctl log=employees.log
[oracle@v19single ~]$ sqlldr user1/user1 control=employees.ctl log=employees.log

SQL*Loader: Release 19.0.0.0.0 - Production on 火 12月 10 20:39:05 2024
Version 19.21.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.

使用パス: 従来型
コミット・ポイントに達しました - 論理レコード件数4

表EMPLOYEES:
4 行は正常にロードされました。

確認するログ・ファイル:
employees.log
ロードの詳細を参照してください。
[oracle@v19single ~]$

実行結果の確認

ロードされたデータを確認します。

SELECT * FROM employees;

結果:

IDNAMEDEPARTMENTSALARY
1JohnSales5000
2JaneHR5500
3BobIT6000
4AliceSales7000
[oracle@v19single ~]$ sqlplus user1/user1

SQL*Plus: Release 19.0.0.0.0 - Production on 火 12月 10 20:40:32 2024
Version 19.21.0.0.0

Copyright (c) 1982, 2022, Oracle. All rights reserved.

最終正常ログイン時間: 火 12月 10 2024 20:39:15 +09:00


Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.21.0.0.0
に接続されました。
SQL> set lin 1000 pages 1000
SQL> col name for a20
SQL> col department for a20
SQL> col salary for 999999999
SQL> SELECT * FROM employees;

ID NAME DEPARTMENT SALARY
---------- -------------------- -------------------- ----------
1 John Sales 5000
2 Jane HR 5500
3 Bob IT 6000
4 Alice Sales 7000

3. 実務で役立つ応用例

条件付きデータロード

部門がSalesのデータだけをロードする例:

WHEN department = 'Sales'

データ加工と変換

ロード時にデータを加工する例です。部門名を大文字に変換します:

FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
(
id INTEGER EXTERNAL,
name CHAR,
department CHAR "UPPER(:department)",
salary INTEGER EXTERNAL
)

並列処理で高速化

大量データを高速にロードするには、以下のオプションを使用します。

sqlldr userid=username/password@dbname control=employees.ctl direct=true parallel=true

オプション解説

  • direct=true:ダイレクトパスを使用
  • parallel=true:並列処理を有効化

エラー処理の自動化

エラー行は**不良ファイル(.bad)**に記録されます。このデータを自動的に再処理するスクリプトを準備することで、作業の効率化が可能です。


4. トラブルシューティング

SQL*Loaderのエラーはログファイルや不良ファイルに記録されます。よくあるエラーとその対処法を以下に示します。

エラー例1:データ型の不一致

エラーログ

Record 3: Rejected - Error on table EMPLOYEES, column SALARY.
ORA-01722: invalid number

原因

  • SALARY列に文字列データが存在

対処法

  • データファイルの修正
  • 制御ファイルでデータ型変換を指定

エラー例2:一意制約の違反

エラーログ

Record 1: Rejected - Error on table EMPLOYEES.
ORA-00001: unique constraint (EMPLOYEES_PK) violated

原因

  • id列が重複

対処法

  • 重複データを事前に除外

5. SQL*Loaderのパフォーマンス最適化

バインド配列サイズの調整

制御ファイルに以下を追加してロード速度を向上:

OPTIONS (BINDSIZE=1048576, ROWS=5000)

インデックスと制約の一時無効化

ロード前にインデックスや制約を無効化し、ロード後に再構築すると速度が向上します。


6. SQL*Loaderの比較:Data Pumpとの違い

機能SQL*LoaderData Pump
データ形式CSV, 固定長Oracle固有のバイナリ形式
処理速度ファイルサイズに依存大量データに最適
条件付きロード可能不可能

7. 総括

SQL*Loaderは、柔軟かつ強力なデータロードツールです。本記事で紹介した内容を実務で活用することで、データインポートの効率と精度を向上させることができます。

ポイントのおさらい

  1. 基本操作を理解して確実にデータをロード
  2. 条件付きロードやデータ変換で業務ニーズに対応
  3. エラー処理や高速化テクニックで運用効率を最大化

ぜひ実践し、SQL*Loaderを使いこなしましょう!

[参考]
ユーティリティ – 9 SQL*Loader制御ファイル・リファレンス

コメント

タイトルとURLをコピーしました