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;
結果:
ID | NAME | DEPARTMENT | SALARY |
---|---|---|---|
1 | John | Sales | 5000 |
2 | Jane | HR | 5500 |
3 | Bob | IT | 6000 |
4 | Alice | Sales | 7000 |
[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*Loader | Data Pump |
---|---|---|
データ形式 | CSV, 固定長 | Oracle固有のバイナリ形式 |
処理速度 | ファイルサイズに依存 | 大量データに最適 |
条件付きロード | 可能 | 不可能 |
7. 総括
SQL*Loaderは、柔軟かつ強力なデータロードツールです。本記事で紹介した内容を実務で活用することで、データインポートの効率と精度を向上させることができます。
ポイントのおさらい:
- 基本操作を理解して確実にデータをロード
- 条件付きロードやデータ変換で業務ニーズに対応
- エラー処理や高速化テクニックで運用効率を最大化
ぜひ実践し、SQL*Loaderを使いこなしましょう!
[参考]
ユーティリティ – 9 SQL*Loader制御ファイル・リファレンス
コメント