LoginSignup
5
5

More than 5 years have passed since last update.

OracleXE 11g DBでcsvデータをIMPORT&EXPORT var.Linux

Last updated at Posted at 2016-11-07

csvファイルのIMPORT&EXPORTの勉強をしていたのでそのメモを。

cuiでcsvデータで出力するときはOracleDBに標準で入っているSQL*Loaderを使います。

EXPORT

IMPORTするにはDB内でspoolを発行して書き出します。
ここではテーブル名を test_table
csvファイルを export.csv とします。

SPOOL /保存したいファイルまでの絶対パス/export.csv
SELECT * FROM test_table;
SPOOL off;

絶対パスを指定せず、ファイル名だけで指定した場合は
/u01/app/oracle/ の直下に保存されます。

これで書き出しができますが、変なところで改行されたり発行したSELECT文まで入ってしまい、そのままのデータとしてうまく扱えないと思うので、整理してみましょう。

まずはSELECT文をcsvファイルに書き込まれないようにするためにサイレントモードでDBに接続します。

//rlwrapを入れているなら
rlwrap -pRed sqlplus -s /nolog

//通常の通りなら
sqlplus -s /nolog

これで左側にでていた SQL > が消えていると思います。
ここから文字数などの設定をしていきます。

set linesize 500;       横一列に表示させる最大文字数
set pagesize 0;         ページ間のセパレータを非表示
set colsep ','          カラム間を,で区切る
set feedback off        確認文を表示させない
set echo off            コンソールメッセージの非表示

これで一度SELECTを発行してみると1レコードずつ横一列で並んで表示されると思います。

そしてSPOOLを発行するとき、カラム名の間に ||*|| を挟んで設定してください。

SPOOL /保存したいファイルまでの絶対パス/export.csv
SELECT カラム名1||*||カラム名2||*||カラム名3 FROM test_table;
SPOOL off;

これでcsvファイルを見てみると余計な列や余白がなくなり、整頓されている状態になると思います。

IMPORT

csvファイルができたら、IMPORTするための制御ファイルを作成します。
制御ファイルの拡張子は.ctlで、ここではimport.ctlとします。

import.ctl
OPTIONS(LOAD=-1, SKIP=0)
LOAD DATA
INFILE '/絶対パス/export.csv'
APPEND
INTO TABLE test_table_clone
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(column1,column2,column3...)

設定項目

OPTIONS設定

LOAD=-1 何行目まで読み込むのかを設定、-1で全て読み込む
SKIP=0 読み飛ばす行を設定
ROWS=-1 どこでコミットするか設定
ERRORS=-1 許容するエラーの件数を設定
などがあります。

保存方法

INSERT テーブルが空だった場合にINPORTする。デフォルトはこのINSERTになる。
APPEND テーブルに追加でデータを保存する。
REPLACE テーブル内のデータを一度削除してから保存する。ロールバックするが、大量のデータを扱う場合は時間がかかる。
TRUNCATE テーブル内のデータを一度削除してから保存する。ロールバックしないが、大量のデータを高速で扱える。

その他の項目

INTO TABLE 'テーブル名' どのテーブルにIMPORTするか指定

FIELDS TERMINATED BY ',' どの文字で区切るか指定

OPTIONALLY ENCLOSED BY '"' データを囲む文字を指定。csvだと"で囲まれる。

TRAILING NULLCOLS(column1, column2...)IMPORTするカラムの指定。

以上が主な設定項目です。
これで制御ファイルと保存元ファイルができたので、実際にIMPORTしていきます。

oracleにログインし、DBに入る前の
-bash-4.2$
の状態で以下のコマンドを発行してください。

sqlldr ユーザー名/ユーザーパス /絶対パス/import.ctl;

SQL*LOADERを使ってcsvファイルを元にテーブルにデータをINSERTできると思います。ここでエラーが出た場合はctlファイルやctl,csvのパーミッションを見直してみてください。

開発環境

CeontOS7
Oracle XE 11g

csv,ctl共に設定方法で苦戦していました。
足りない部分が多々あるので各々で調べてみてください。

5
5
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5