Sqlplus將結(jié)果導(dǎo)出為csv文件(附更適合高版本sqlplus的寫法)

前言

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é)果集進行格式化

image.png

最終使用的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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市锣险,隨后出現(xiàn)的幾起案子蹄皱,更是在濱河造成了極大的恐慌览闰,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巷折,死亡現(xiàn)場離奇詭異压鉴,居然都是意外死亡,警方通過查閱死者的電腦和手機锻拘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門油吭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人署拟,你說我怎么就攤上這事婉宰。” “怎么了推穷?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵心包,是天一觀的道長。 經(jīng)常有香客問我馒铃,道長蟹腾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任区宇,我火速辦了婚禮岭佳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘萧锉。我一直安慰自己,他們只是感情好述寡,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布柿隙。 她就那樣靜靜地躺著,像睡著了一般鲫凶。 火紅的嫁衣襯著肌膚如雪禀崖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天螟炫,我揣著相機與錄音波附,去河邊找鬼。 笑死昼钻,一個胖子當(dāng)著我的面吹牛掸屡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播然评,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼仅财,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了碗淌?” 一聲冷哼從身側(cè)響起盏求,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤抖锥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后碎罚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體磅废,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年荆烈,在試婚紗的時候發(fā)現(xiàn)自己被綠了拯勉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡耙考,死狀恐怖谜喊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情倦始,我是刑警寧澤斗遏,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站鞋邑,受9級特大地震影響诵次,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜枚碗,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一逾一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧肮雨,春花似錦遵堵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至波丰,卻和暖如春壳坪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背掰烟。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工爽蝴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人纫骑。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓蝎亚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親惧磺。 傳聞我的和親對象是個殘疾皇子颖对,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容