TL;DR
OracleのテーブルからデータをCSV形式で出力したい場合、SQLDeveloperなどに機能で出力するのが一番手っ取り早いが、やむを得ない理由でSQLPlusを利用して出力したい場合に、Oracle12.2以降のSQLPlusであればコマンドを利用して出力できるようになっているのでそのメモ。
コマンド
SET MARKUP CSV [ON] [[DELIMITER '<任意の記号>'] [QUOTE \]]
SQL> select * from test_manage_table where report = 650;
-->結果
"KAISYA","FUNCTION","REPORT","IDENTIFIER","SELECT_ORDER","ITEM_ORDER","MASTER_DIV","MASTER_KAISYA","MASTER_ID","UNION_SPECIFY","SYMBOL1","SYMBOL2","COMPARISON","LANG_ID","CONTENTS1","CONTENTS2","UPDATE_DATE","UPDATE_MAN"
1,214,650,3,1,7,"0",0,0,"0",,,1,,"部門",,"20-12-04","TEST"
1,214,650,5,1,4,"0",0,0,"0",,,1,,"H170",,"19-07-30","TEST"
- 文字列型の項目のみDelimiterで囲われている。
- 本当はQUOTEもシングルクォートが指定できればよかったけど、ONOFFしか設定できない。
このままではNULL項目がブランクで出力されており、Insert文に流用する際に面倒なのでNULLも表示するよう設定する。
SQL> set NULL 'NULL'
SQL> select * from test_manage_table where report = 650;
-->結果
"KAISYA","FUNCTION","REPORT","IDENTIFIER","SELECT_ORDER","ITEM_ORDER","MASTER_DIV","MASTER_KAISYA","MASTER_ID","UNION_SPECIFY","SYMBOL1","SYMBOL2","COMPARISON","LANG_ID","CONTENTS1","CONTENTS2","UPDATE_DATE","UPDATE_MAN"
1,214,650,3,1,7,"0",0,0,"0","NULL","NULL",1,NULL,"部門","NULL","20-12-04","TEST"
1,214,650,5,1,4,"0",0,0,"0","NULL","NULL",1,NULL,"H170","NULL","19-07-30","TEST"
- 数値型項目がうまく「NULL」で出力されているのは良いが、文字列項目かつNULLの場合も「"NULL"」が表示されてしまうのはいただけない。
追記
NULLデータのカラムをブランクとして出力したい場合は、単純にSET NULL """"""とすれば「""」と
表示される。
- 列名ヘッダーが不要な場合は
SET HEAD OFF、「~が選択されました」のフィードバックが不要な場合はSET FEEDRBACK OFFをつければよい。