oracle之spool使用总结--linesize不生效的问题

时间:2024-04-13 11:38:05

       前言:最近事情不是特别多,配合同事实现平台的自动化运维工作,其中就需要用到oracle的spool,用于实现从oracle数据库中导出巡检数据,在此过程中就遇到了一个问题:使用spool导出来的数据每行只有80字符长度,当大于80个字符时就换行或被截取了?今天对此进行总结一下

        一、关于spool使用的重点设置说明

关于spool的详细说明,可以网上找找,资料一大堆,在此写几重要设置和基本使用方法即可:

v_spool.sql的编辑为:

define dt=&1 ##接收第一个参数
set wrap on;##输出行长度大于设置行长度时(用set linesize n命令设置);值为on时,多余的字符另起一行显示,否则多余的字符将被截取,不予显示;
set feedback off; ##回显本次sql命令处理的记录条数,缺省为on,设置显示“已选择XX行”
set heading off; ##输出域标题,字段的名称,缺省为on
set trimout on;##去除标准输出每行的拖尾空格,缺省为off
set trimspool on; ##去除重定向(spool)输出每行的拖尾空格,缺省为off
spool /root/dailyCheck/dpiFtp/data/xunJian_dailyCheck_dpiFtp_result_&&dt.csv 
select t.day||','||t.hour||','||t.s1mmefilenum||','||t.s1ufilenum||','||t.s11filenum||','||t.gnfilenum||','||t.mcfilenum||','||t.gncfilenum||','||t.s6afilenum||','||t.sgsfilenum||','||t.cellfilenum||','||to_char(t.s1mmefilesize,'fm9990.09')||','||to_char(t.s1ufilesize,'fm9990.09')||','||to_char(t.s11filesize,'fm9990.09')||','||to_char(t.gnfilesize,'fm9990.09')||','||to_char(t.mcfilesize,'fm9990.09')||','||to_char(t.gncfilesize,'fm9990.09')||','||to_char(t.s6afilesize,'fm9990.09')||','||to_char(t.sgsfilesize,'fm9990.09')||','||to_char(t.allfilesize,'fm9990.09')||','||t.s1mmerownum||','||t.s1urownum||','||t.s11rownum||','||t.gnrownum||','||t.mcrownum||','||t.gncrownum||','||t.s6arownum||','||t.sgsrownum
from tab t where day='&&dt' order by hour; 
spool off 
exit

在脚本执行sqlplus:sqlplus -s ${sql_uer}/${sql_pass}@${sql_tns} @$workPath/v_spool.sql $dt

说明:sql_usr:用户,sql_pass:密码,$dt:传入spool的参数

        二、解决:使用spool导出来的数据不换行或截取

问题现象:在spool文件中设置了linesize(set lineszie 1000),但是统计出来的数据会换行!

问题解决:在sqlplus的登录配置文件中指定linesize参数,让用户登录时不使用默认的linesize值,

这个配置文件为:glogin.sql,详细如下图:

oracle之spool使用总结--linesize不生效的问题

文件的位置:1、找到sqlplus的位置,即:whereis sqlplus

2、进入sqlplus的位置并返回上一级,再进入目录(sqlplus/admin),即可找到glogin.sql

3、编译glogin.sql文件,增加linesize的设置,值设置为你需要的长度,如下:

oracle之spool使用总结--linesize不生效的问题

设置后,就不会存在有换行或截断的情况了!