前言
sqlplus
支持我們通過spool
命令來將查詢結(jié)果進行導(dǎo)出撩炊,基于這個命令我們可以實現(xiàn)把結(jié)果集封裝為csv格式文件進行輸出蟹但。在sqlplus12以上的版本代虾,oracle還新提供了markup
語法來幫助我們開啟csv格式的輸出結(jié)果優(yōu)化桑嘶,對我們輸出統(tǒng)一內(nèi)容格式的csv文件有相當(dāng)大的幫助。這也是網(wǎng)上很多文章所沒有提到的優(yōu)化點
(一)適合sqlplus12之前版本的操作
用sqlplus
查詢數(shù)據(jù)的小伙伴肯定知道册着,默認情況下sqlplus的結(jié)果展示很不友好拴孤,數(shù)據(jù)量或者展示的列數(shù)量一多,結(jié)果集就會很混亂甲捏。結(jié)果集一混亂的話演熟,輸出結(jié)果也就會混亂,這樣最終輸出到csv結(jié)果文件的內(nèi)容還是會有問題的司顿。我們下面分步驟講一下怎么解決這個問題
步驟1:創(chuàng)建待執(zhí)行的sql文件
這里的spool /opt/sql-script/export.csv
表示將結(jié)果輸出到這個路徑下面的文件中芒粹,如果文件不存在會自己創(chuàng)建,$sqlScript
需要填入要執(zhí)行的sql語句
set feedback off
set heading on
set long 30
set termout on
set echo on
set NULL 'N/A'
set numwidth 18
set pagesize 9999
set linesize 32767
set trimout on
set trimspool on
set newp none
spool /opt/sql-script/export.csv
$sqlScript
spool off
exit
EOF
上面涉及到很多個參數(shù)大溜,我們下面簡單介紹一下
set colsep # 定義使用 , 作為分隔符
set feedback off #回顯本次sql命令處理記錄條數(shù)化漆,off表示關(guān)閉
set heading off # 輸出標題
set newp none #設(shè)置查詢出來的數(shù)據(jù)分多少頁顯示,如果需要連續(xù)的數(shù)據(jù)钦奋,中間不要出現(xiàn)空行就把newp設(shè)置為none
set pagesize 0 # 輸出每頁行數(shù)座云,為了避免分頁設(shè)置為0
set linesize 200 # 每行大小,如果設(shè)置太小付材,會分行朦拖,最好是超好輸出最大值
set trimout on # 去除標準輸出每行的拖尾空格
set termout off #顯示腳本中的命令的執(zhí)行結(jié)果
set echo on #設(shè)置運行命令是否顯示語句
set numwidth 12 # 輸出number類型域長度
set NULL 'N/A' # 設(shè)置字段值為NULL時默認的展示方式為N/A
我們使用sqlplus -s username/password@//instance xxxx.sql
,注意這里需要用-s
參數(shù)來開啟靜默模式啟動厌衔,然后xxxx.sql
需要替換為我們步驟1創(chuàng)建的sql文件璧帝。需要注意的是,這種方式只是盡可能的通過格式化來讓結(jié)果集符合csv格式的要求富寿,但實際上應(yīng)用起來讀者自己是覺得不太實用的睬隶,時不時會出現(xiàn)csv文件內(nèi)容錯亂的問題。
PS:如果不希望每次都配置的話页徐,可以把這些初始化的操作放到glogin.sql
中苏潜,具體做法可以百度一下
(二)適合sqlplus12(含)之后版本的操作
在sqlplus12版本之后,推出了專門針對csv格式文件輸出的參數(shù)markup
泞坦,我們可以利用set markup csv on
語法來全方位對結(jié)果集進行格式化
最終使用的sql配置如下:
set feedback off
set heading on
set long 30
set termout on
set echo on
set NULL 'N/A'
set numwidth 18
set markup csv on
spool /tmp/uShell/export.csv
$sqlScript
spool off
exit
EOF
根據(jù)筆者親身體驗窖贤,使用官方自帶的格式化語法要高效得多,所有結(jié)果都自動格式化好了贰锁,基本不會再遇到任何亂碼問題赃梧。
需要注意的是,根據(jù)官方文檔描述使用markup
參數(shù)后豌熄,下面的參數(shù)會自動失效授嘀。
When SET MARKUP CSV is enabled, the following SQL*Plus commands will have no effect on the output:
BREAK
BTITLE
COMPUTE
REPFOOTER
REPHEADER
When SET MARKUP CSV is enabled, the following SET commands will have no effect on the output:
SET COLSEP
SET HEADSEP
SET LINESIZE
SET NEWPAGE
SET PAGESIZE
SET PAUSE
SET RECSEP
SET SHIFTINOUT
SET TAB
SET TRIMOUT
SET TRIMSPOOL
SET UNDERLINE
SET WRAP
When SET MARKUP CSV is enabled, the following COLUMN commands will have no effect on the output:
COLUMN ENTMAP
COLUMN FOLD_AFTER
COLUMN FOLD_BEFORE
COLUMN JUSTIFY
COLUMN NEWLINE
COLUMN NEW_VALUE
COLUMN NOPRINT
COLUMN OLD_VALUE
COLUMN WRAP
參考文章
教你玩轉(zhuǎn) sqlplus https://developer.aliyun.com/article/830332
oracle關(guān)于set可選參數(shù)的官方說明:https://docs.oracle.com/en/database/oracle/oracle-database/19/sqpug/SET-system-variable-summary.html