Linux 平台下 Spool导出数据并发送到邮箱

2024-04-04 04:18

本文主要是介绍Linux 平台下 Spool导出数据并发送到邮箱,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

Spool常用的设置
set colsep' ';
    //域输出分隔符
set echo off;
    //显示start启动的脚本中的每个sql命令,缺省为on
set feedback off;
  //回显本次sql命令处理的记录条数,缺省为on
set heading off;
   //输出域标题,缺省为on
set pagesize 0;
   //输出每页行数,缺省为24,为了避免分页,可设定为0
set termout off;
   //显示脚本中的命令的执行结果,缺省为on
set trimout on;
   //去除标准输出每行的拖尾空格,缺省为off
set trimspool on;
  //去除重定向(spool)输出每行的拖尾空格,缺省为off

set wrap off;      //当一行显示不下时不分行显示,这种情况下可能会导致行截断

set long 999999       //显示不完整

 

 

注意:LINESIZE要稍微设置大些,免得数据被截断,它应和相应的TRIMSPOOL结合使用防止导出的文本有太多的尾部空格。但是如果 LINESIZE设置太大,会大大降低导出的速度,另外在WINDOWS下导出最好不要用PLSQL导出,速度比较慢,直接用COMMEND下的 SQLPLUS命令最小化窗口执行。

 

如果我们不采用colsep 分隔符,也可以直接设置字段的宽度来执行。

如:column 列名 format a10

 

对于字段内包含很多回车换行符的应该给与过滤,形成比较规矩的文本文件。通常情况下,我们使用SPOOL方法,将数据库中的表导出为文本文件的时候会采用两种方法,如下述:

 

方法一:采用以下格式脚本 
        set colsep '|'               --
设置|为列分隔符
  set trimspool on
  set linesize 9999     -- 如果显示不完全,可以适当增加该参数
  set pagesize 2000         
  set newpage 1
  set heading off           
  set term off
        set num 18                 
        set feedback off           
  spool 路径+文件名
  select * from tablename;
  spool off

方法二:采用以下脚本
       set trimspool on
  set linesize 120
  set pagesize 2000
  set newpage 1
  set heading off
  set term off
  spool 路径+文件名
  select col1||','||col2||','||col3||','||col4||'..' from tablename;
  spool off

 

 

两种方法比较:

 

方法一采用设定分隔符然后由sqlplus自己使用设定的分隔符对字段进行分割,

方法二将分隔符拼接在SELECT语句中,即手工控制输出格式。

 

在实践中,发现通过方法一导出来的数据具有很大的不确定性,这种方法导出来的数据再由sqlldr导入的时候出错的可能性在95%以上,尤其对大批量的数据表,如100万条记录的表更是如此,而且导出的数据文件狂大。

 

而方法二导出的数据文件格式很规整,数据文件的大小可能是方法一的1/4左右。经这种方法导出来的数据文件再由sqlldr导入时,出错的可能性很小,基本都可以导入成功。

因此,实践中我建议大家使用方法二手工去控制spool文件的格式,这样可以减小出错的可能性,避免走很多弯路。

 

对于SPOOL数据的SQL,最好要自己定义格式,以方便程序直接导入,SQL语句如:
select taskindex||'|'||commonindex||'|'||tasktype||'|'||to_number(to_char(sysdate,'YYYYMMDD'))

from ssrv_sendsms_task;

 


测试

 

get00001info.sh

 

##############################################################

##   get000001Info.sh           ##

##   create by TianleSoftware    ##

##############################################################

#!/bin/ksh

EDITOR=vi; export EDITOR

PATH=$PATH:$ORACLE_HOME:$ORACLE_HOME/bin:/usr/ccs/bin:/bin:/usr/bin:/usr/sbin:/sbin:/usr/openwin/bin:/opt/bin:.; export PATH

ORACLE_SID=PPRD10; export ORACLE_SID

ORACLE_BASE=/data/app/oracle; export ORACLE_BASE

ORACLE_HOME=$ORACLE_BASE/10.2.0; export ORACLE_HOME

LD_LIBRARY_PATH=$ORACLE_HOME/lib; export LD_LIBRARY_PATH

TNS_ADMIN=/var/opt/oracle;export TNS_ADMIN

NLS_LANG=american; export NLS_LANG

NLS_DATE_FORMAT='Mon DD YYYY HH24:MI:SS'; export NLS_DATE_FORMAT

 

------------------------------------ ---------------------------------------

# 我们可以在脚本里指定这些环境变量否则我们查询出来的某些数据可能出现异常,比如中文乱码,时间格式不对等。 当然也可以通过其他的方式对这些环境变量进行设置。 具体参考我的blog

 

sqlplus 汉字乱码问题的解决

http://www.cndba.cn/Dave/article/1203

 

修改sqlplus中显示时间日期的格式

http://www.cndba.cn/Dave/article/1204

 

------------------------------------ ---------------------------------------

 

cd /u03/scripts

sqlplus  -s  user/pwd@sid <<EOF

 

# -s 参数屏蔽打印到屏幕上的其他信息,只显示sql执行后从DB中查询出来的信息,过滤掉spool函数执行时在文件中写入的其他信息。

 

set heading on

set linesize 9999

set pagesize 0

set trimspool ON

set termout off

set feedback off  

set wrap off

 

column infoid format a8

column empid format a5

column deptid format a5

column msg format a130

column operator format a8

column sendtime format a25

column billno format a10

column infotype format a6 

 

spool 000001info.xls

select  ' 信息编号', '收派员' ,'点部' ,'操作员' ,'时间' ,'催派运单号','类型 ','信息内容' from dual

union all

SELECT t.infoid,t.empid,r.deptid,t.operator,to_char(t.sendtime,'yyyy-mm-dd hh24:mi:ss'),t.billno,t.infotype,t.msg FROM otherinfo t,employee r WHERE   t.empid = r.empid AND t.sendtime >=   

 trunc  (( TRUNC ((SYSDATE - 1) , 'dd') + 15 / 48 ),'mi'

             )   

             and t.sendtime <   TRUNC ((SYSDATE ) , 'dd') AND t.operator = 000001;

 

spool off

exit

EOF

#EOF  -- 有时需要写2EOF才能发送邮件

 

 

 

#sendMail

uuencode 000001info.xls 000001info.xls|mailx -s "000001每日内部通讯如有疑问请联系IT" tianlesoftware@vip.qq.com

 

[oracle@hfcc-svr-newccsdb1 scripts]$ crontab -l

00 8 * * * /u03/scripts/get00001info.sh

 



 ------------------------------------------------------------------------------
QQ: 492913789
Email: ahdba@qq.com
Blog: http://www.cndba.cn/dave
网上资源: http://tianlesoftware.download.csdn.net
相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx
DBA1 群:62697716(满);   DBA2 群:62697977(满)   DBA3 群:62697850(满)  
DBA 超级群:63306533(满);  DBA4 群: 83829929  DBA5群: 142216823   
DBA6 群:158654907  聊天 群:40132017   聊天2群:69087192
--加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请

这篇关于Linux 平台下 Spool导出数据并发送到邮箱的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/874770

相关文章

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

pandas数据的合并concat()和merge()方式

《pandas数据的合并concat()和merge()方式》Pandas中concat沿轴合并数据框(行或列),merge基于键连接(内/外/左/右),concat用于纵向或横向拼接,merge用于... 目录concat() 轴向连接合并(1) join='outer',axis=0(2)join='o

Linux线程同步/互斥过程详解

《Linux线程同步/互斥过程详解》文章讲解多线程并发访问导致竞态条件,需通过互斥锁、原子操作和条件变量实现线程安全与同步,分析死锁条件及避免方法,并介绍RAII封装技术提升资源管理效率... 目录01. 资源共享问题1.1 多线程并发访问1.2 临界区与临界资源1.3 锁的引入02. 多线程案例2.1 为

shell脚本批量导出redis key-value方式

《shell脚本批量导出rediskey-value方式》为避免keys全量扫描导致Redis卡顿,可先通过dump.rdb备份文件在本地恢复,再使用scan命令渐进导出key-value,通过CN... 目录1 背景2 详细步骤2.1 本地docker启动Redis2.2 shell批量导出脚本3 附录总

批量导入txt数据到的redis过程

《批量导入txt数据到的redis过程》用户通过将Redis命令逐行写入txt文件,利用管道模式运行客户端,成功执行批量删除以Product*匹配的Key操作,提高了数据清理效率... 目录批量导入txt数据到Redisjs把redis命令按一条 一行写到txt中管道命令运行redis客户端成功了批量删除k

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

Oracle数据库定时备份脚本方式(Linux)

《Oracle数据库定时备份脚本方式(Linux)》文章介绍Oracle数据库自动备份方案,包含主机备份传输与备机解压导入流程,强调需提前全量删除原库数据避免报错,并需配置无密传输、定时任务及验证脚本... 目录说明主机脚本备机上自动导库脚本整个自动备份oracle数据库的过程(建议全程用root用户)总结

Linux如何查看文件权限的命令

《Linux如何查看文件权限的命令》Linux中使用ls-R命令递归查看指定目录及子目录下所有文件和文件夹的权限信息,以列表形式展示权限位、所有者、组等详细内容... 目录linux China编程查看文件权限命令输出结果示例这里是查看tomcat文件夹总结Linux 查看文件权限命令ls -l 文件或文件夹

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

idea的终端(Terminal)cmd的命令换成linux的命令详解

《idea的终端(Terminal)cmd的命令换成linux的命令详解》本文介绍IDEA配置Git的步骤:安装Git、修改终端设置并重启IDEA,强调顺序,作为个人经验分享,希望提供参考并支持脚本之... 目录一编程、设置前二、前置条件三、android设置四、设置后总结一、php设置前二、前置条件