Sqlplus将结果导出为csv文件(附更适合高版本sqlplus的写法)

前言

sqlplus支持我们通过spool命令来将查询结果进行导出,基于这个命令我们可以实现把结果集封装为csv格式文件进行输出。在sqlplus12以上的版本,oracle还新提供了markup语法来帮助我们开启csv格式的输出结果优化,对我们输出统一内容格式的csv文件有相当大的帮助。这也是网上很多文章所没有提到的优化点

(一)适合sqlplus12之前版本的操作

sqlplus查询数据的小伙伴肯定知道,默认情况下sqlplus的结果展示很不友好,数据量或者展示的列数量一多,结果集就会很混乱。结果集一混乱的话,输出结果也就会混乱,这样最终输出到csv结果文件的内容还是会有问题的。我们下面分步骤讲一下怎么解决这个问题

步骤1:创建待执行的sql文件

这里的spool /opt/sql-script/export.csv表示将结果输出到这个路径下面的文件中,如果文件不存在会自己创建,$sqlScript需要填入要执行的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

上面涉及到很多个参数,我们下面简单介绍一下

set colsep  # 定义使用 , 作为分隔符
set feedback off #回显本次sql命令处理记录条数,off表示关闭
set heading off # 输出标题
set newp none #设置查询出来的数据分多少页显示,如果需要连续的数据,中间不要出现空行就把newp设置为none
set pagesize 0 # 输出每页行数,为了避免分页设置为0
set linesize 200 # 每行大小,如果设置太小,会分行,最好是超好输出最大值
set trimout on # 去除标准输出每行的拖尾空格
set termout off #显示脚本中的命令的执行结果
set echo on #设置运行命令是否显示语句
set numwidth 12 # 输出number类型域长度
set NULL 'N/A' # 设置字段值为NULL时默认的展示方式为N/A

我们使用sqlplus -s username/password@//instance xxxx.sql ,注意这里需要用-s参数来开启静默模式启动,然后xxxx.sql需要替换为我们步骤1创建的sql文件。需要注意的是,这种方式只是尽可能的通过格式化来让结果集符合csv格式的要求,但实际上应用起来读者自己是觉得不太实用的,时不时会出现csv文件内容错乱的问题。

PS:如果不希望每次都配置的话,可以把这些初始化的操作放到glogin.sql中,具体做法可以百度一下

(二)适合sqlplus12(含)之后版本的操作

在sqlplus12版本之后,推出了专门针对csv格式文件输出的参数markup,我们可以利用set markup csv on语法来全方位对结果集进行格式化

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

根据笔者亲身体验,使用官方自带的格式化语法要高效得多,所有结果都自动格式化好了,基本不会再遇到任何乱码问题。

需要注意的是,根据官方文档描述使用markup参数后,下面的参数会自动失效。

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

参考文章

教你玩转 sqlplus https://developer.aliyun.com/article/830332
oracle关于set可选参数的官方说明:https://docs.oracle.com/en/database/oracle/oracle-database/19/sqpug/SET-system-variable-summary.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容