Oracle 11でSELECT文の実行結果をCSV/TSV出力する

Oracleからデータを取り出してファイル形式で出力する方法。度々調べているのでまとめておく。

前提

検証に用いたバージョンは、Oracle 11g Release2。

Oracle 12以降でも動くとは思われるが、12c Release2以降はSET MARKUP CSV ONを使えばCSV出力ができるため、このページで紹介する方法を使う理由はない。

SELECTの実行結果をファイルに出力する

CSVで出力する

以下のように実行することで、SELECT文で実行した内容をresult.csvに出力することができる。

set heading off
set trimspool on
set feedback off
set linesize 10000
set pagesize 0
set colsep ','

SPOOL result.csv

SELECT * FROM table_name;

SPOOL OFF

ただしコンマで区切るだけであり、データ部がダブルクォートで括られるわけではない点に注意が必要。
データにコンマが含まれる場合は想定のCSVのフォーマットとならない。

TSV(Tab区切り)で出力する

CSVは一般的な形式だが、データにコンマやスペースが含まれる場合はTSVで出力したほうがよい。
また出力結果をシェルコマンドで扱うような場合も、Tab区切りのほうが親和性が高い。

以下のように、colsepの設定をTab文字に置換すればよい。

set heading off
set trimspool on
set feedback off
set linesize 10000
set pagesize 0
set colsep '    '

SPOOL result.tsv

SELECT * FROM table_name;

SPOOL OFF

コンマもTab文字もデータ部で使われている場合の回避策

コンマやスペース、Tab文字のいずれもデータ部に含まれている場合は、以下のような方法でできる…はず。

  • ①全角コンマや全角スペースに置き換えて問題ない場合は、SQLで置換処理を行った上で出力する
    例:半角コンマや半角スペースを全角に置換してCSV出力する。
  • ②全角コンマや全角スペースを半角に統一しても問題ない場合は、①の後にシェルコマンドで半角へ置換する
    例:半角コンマや半角スペースを全角に置換してCSV出力する。出力後は全角コンマと全角スペースを半角に戻す。
  • ③SQLでTabをデータに含まれない文字列へ置換して出力し、その後シェルコマンド等で元の文字列へ戻す
    例:元々のデータには”@“文字が使われていないため、Tab文字を”@“に置換してTSV出力する。出力後は”@“をTab文字へ置換する。
  • ④SQLで何らかの文字を一時的にエスケープし、出力した後にシェルコマンドで元の文字列へ戻す[^escape]
    例:元々のデータ”!“を”!!"、"@“を”@@“にそれぞれ置換し、Tab文字を”!@“に置換してTSV出力する。出力後は”!@“をTab文字に置換した後、”!!“を”!“に、"@@“を”@“に置換する。

シェルからSQLファイルを指定したコマンドで実行する

併せて使うことが多いので、これもメモしておく。

シェルコマンドからSQLファイルを指定して実行したい場合は、以下のようにユーザ名やパスワード等の接続情報の他、SQLを記述したファイル名を@をつけて指定すればよい。

sqlplus user/password@xe @filename.sql

こうすることで、シェルスクリプトの中から一行でSQLを実行+ファイルへ出力できるため、シェルスクリプトの一部として組み込みやすくなる。

関連記事


  1. DDLを自動生成してJavaと各DBのデータ型を比較してみた
  2. Spring BootアプリにFlywayを導入してみた
  3. Spring Data JPAのEntityクラスからDDLを生成する
  4. JavaサーブレットでSQLiteを使う場合のパス指定方法

comments powered by Disqus