前言
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
语法来全方位对结果集进行格式化
最终使用的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