Oracle 12cR2 新機能 「CSVレポートの作成」を試す

Posted on 2017-06-22(木) in _middleware

こんにちは!

Oracle Database 12c Release2から登場した SQL*Plus の新機能に「CSVレポートの作成」という地味にすごい機能があります

何がすごいかと言うと今まであったらいいなと思っていた、ありそうで無かった機能が今更な感じでついに実装されたことがすごい!

概要

  • 方法は2通りあります

  • SETシステム変数 MARKUP CSV を 有効にする

    • SET MARK[UP] CSV {ON|OFF} [DELIMI[TER] character] [QUOTE {ON|OFF}]
      • DELIMITER: 区切文字はデフォルト 「,」comma
      • QUOTE: 囲み文字は「"」二重引用符の ON, OFF のみ指定可能(デフォルト ON)
  • SQL*Plusコマンドラインで-MARKUP CSV ONオプションを使用する

    • sqlplus -m "csv on" [user_name]/[password]@[service_name]

詳細はこちら(SQL*Plus®ユーザーズ・ガイドおよびリファレンス)

SQL*Plusからのレポートの生成

早速試してみます

  • テストデータはこんな感じで
SQL> select * from aaa1;

        ID NAME                        NUM UPD                 MEMO
---------- -------------------- ---------- ------------------- ------------------------------
         1 あいうえお                   10 2015/08/01 12:34:56 memo
         2                                                     全部NULL
         4 テスト(\)4                 400 2015/08/17 05:53:02 バクスラ
         5 てすと(,)5                 500 2015/08/17 05:53:06 カンマ
         6 てすと(")6                 600 2015/08/17 05:53:10 ダブル
         7 てすと(;)7                 700 2015/08/17 05:54:23 セミコ
         8 てすと(')8                 800 2015/08/17 05:54:26 シングル
         9 てすと(                     900 2015/08/17 05:54:30 改行(CRLF)
           )9

SETシステム変数 MARKUP CSV を 有効にする

SQL> SET MARKUP CSV ON
SQL> select * from aaa1;

"ID","NAME","NUM","UPD","MEMO"
1,"あいうえお",10,"2015/08/01 12:34:56","memo"
2,,,,"全部NULL"
4,"テスト(\)4",400,"2015/08/17 05:53:02","バクスラ"
5,"てすと(,)5",500,"2015/08/17 05:53:06","カンマ"
6,"てすと("")6",600,"2015/08/17 05:53:10","ダブル"
7,"てすと(;)7",700,"2015/08/17 05:54:23","セミコ"
8,"てすと(')8",800,"2015/08/17 05:54:26","シングル"
9,"てすと(
)9",900,"2015/08/17 05:54:30","改行(CRLF)"

※ QUOTE ON の場合、データに含まれる「"」二重引用符は「””」のように重ねて出力される

バッチ処理のサンプル

SQL*Plusコマンドラインで-MARKUP CSV ONオプションを使用する

  • コマンド
sqlplus -s -m "csv on" uname/pwd@orclpdb @select_csv aaa1
  • SQL ファイル:select_csv.sql
SET ECHO OFF
SET TERMOUT OFF
SET VERIFY OFF
SET FEEDBACK OFF
ALTER SESSION SET NLS_DATE_FORMAT="YYYY/MM/DD HH24:MI:SS";
SPOOL &1
SELECT * FROM &1;
SPOOL OFF
EXIT
  • 出力ファイル: aaa1.lst
   
"ID","NAME","NUM","UPD","MEMO"
1,"あいうえお",10,"2015/08/01 12:34:56","memo"
2,,,,"全部NULL"
4,"テスト(\)4",400,"2015/08/17 05:53:02","バクスラ"
5,"てすと(,)5",500,"2015/08/17 05:53:06","カンマ"
6,"てすと("")6",600,"2015/08/17 05:53:10","ダブル"
7,"てすと(;)7",700,"2015/08/17 05:54:23","セミコ"
8,"てすと(')8",800,"2015/08/17 05:54:26","シングル"
9,"てすと(
)9",900,"2015/08/17 05:54:30","改行(CRLF)"

※なんか先頭に空行が1行できてしまうのだが……

まとめ

便利です!
ちょっとしたCSV出力するために PL/SQL や独自スクリプトを作成する必要がなくなりますね