SQL*Loaderで大量データをインポートしたい!

技術情報
技術情報

数十万件のデータをOracleに高速インポートする手段はないか探していたところ
「SQL*Loader」というものがあり、難しそうだったので避けていましたが
結局これ以外では出来なさそうだったのでやってみました。
同じことがしたい方向けの手順です。

SQL*Loaderのインストール

今回は自分のローカルPCで実行したかったため、まずSQL*Loaderをインストールするところから始めました。
Oracleが入っているサーバ等、既にインストールされている場合もあります。

1.必要なものをダウンロードする

 「Oracle Instant Client ダウンロード Windows」 で検索して画面遷移
 Instant Client for Microsoft Windows と書かれたところのリンクを押下した後の画面で
 
 ・Basic Package
 ・Tools Package
 
 これらのファイルをダウンロードします。
 ファイル名がこんな感じのもの↓です。
 
 instantclient-basic-windows.x64-xx.xx.x.x.x.zip
 instantclient-tools-windows.x64-xx.xx.x.x.x.zip


2.解凍して配置する

 今回は以下のパスに置きました。
 C:\oracle\instantclient

3.環境変数に追加する

 ① スタート →「環境変数」で検索
 ② 「システム環境変数を編集」
 ③ 「環境変数」
 ④ 「Path」を選択 → 編集

 C:\oracle\instantclient
 を追加します。

 コマンドプロンプトでsqlldrと打ってインストールされているっぽければOKです。

ctlファイル(設定ファイル)の作成

こんな感じのものを作り、「○○用情報テーブル.ctl」という名前で保存しました。

LOAD DATA
INFILE 'CSV\○○用情報テーブル_DATA.csv'
APPEND INTO TABLE TEST."○○用情報テーブル"
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
  "年度","番号","枝番","所属コード","所属名","電話番号","氏名","生年月日"
)

説明↓

INFILE~の部分取り込むCSVファイルのパス
APPEND INTO TABLE~の部分取り込み先のテーブル名
TRAILING NULLCOLS~の部分取り込むCSVの列タイトル
(今回はCSV開いて1行目をダブルクォーテーション囲みカンマ区切りに変換してそのまま記載)

コマンド実行

こんな感じのものをコマンドプロンプトで実行します。
今回CSVのパスを相対パスにしているのでその階層まで移動してから実行します。

sqlldr db_id/db_pass@//XXX.XX.XXX.XXX:1520/ORCLPDB1 control=○○用情報テーブル.ctl skip=1

説明↓※簡単なところは省略

ORCLPDB1Oracleサービス名
control=さっき作ったctlファイル名
skip=1CSVの先頭1行の読み込みをスキップする
(見出し行の場合)

Tips:注意点

 構築先のテーブルやカラムの名前が日本語だった事が原因(だったのか…?)で
 文字コードの問題でめちゃくちゃエラーになりました。
 結局以下にて解決しました。
 
 以下を一致させる必要あり↓
  ①Oracleの文字コード
  ②実行するターミナルの文字コード
  ③SQL*Loaderで実行する設定ファイル(ctl)の文字コード

 指定した値や実行コマンド↓
  ①Oracleの文字コード:JA16SJISTILDE
  ②実行するターミナルの文字コード:$env:NLS_LANG = “JAPANESE_JAPAN.JA16SJISTILDE”
  ③SQL*Loaderで実行する設定ファイル(ctl)の文字コード:SJIS

まとめ

今回インポートのために1csvファイルに対して1ctlファイルを作成したので
25ファイルくらい作る羽目になったのですが、そんなことをしなくても
調べたらもっと良い方法があるだろうなと思いつつ、今回は思うだけに留まりました。

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