2018/05/17

Tiptop:用SQL脚本和Shell脚本自动发Excel报表给用户

Tiptop服务器启用外部SMTP发邮件后,一些简单的报表必须要通过邮件发给User时,就不必麻烦去写CR报表了,可以用SQL脚本和Shell脚本配合完成,而且效果也不错。

简单的步骤如下:

一、写SQL脚本。SQL语句先加上如下内容,保证输出资料的可读性。
set linesize 200
set term off verify off feedback off pagesize 999
set markup html on entmap ON spool on preformat off
SPOOL filename.xls;
  以上前三行是为了规范Excel的格式,最后一行是指定输出文件的位置和文件名。请自行调整。
  然后在SQL脚本文件中加入你的SQL语句,以及最后一行为
SPOOL OFF ;
  最后将其保存,例如文件后为myquery.sql。

二、写Shell脚本。直接贴我的吧。
!/bin/sh
export LANG=en_US.utf8
export ORACLE_BASE=/u2/oracle;
export ORACLE_HOME=/u2/oracle/product/11.2.0/dbhome_1;
export ORACLE_SID=topprod;
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8;
export PATH=$PATH:/usr/bin:sbin:/usr/sbin:/usr/contrib/bin:$ORACLE_HOME/bin
cd /yourpath
sqlplus username/password @./myquery.sql〈〈EOF 
quit
EOF
filename=filename.xls
filesize=`ls -l $filename | awk '{ print $5 }'`
normail_size=$((19))
if [ $filesize -ne $normail_size ]
then
        echo "" | mailx -a $filename -s "Email Subject" username@mydomain.com
fi
其中第二到七行为环境变量声明,以避免权限问题和字符集混乱等。第九行中EOF前的尖括号请替换为半角,此处是调用SQL脚本以得到查询结果。第12行的文件名需与SQL脚本中声明的一致。后面几行是用ls和awk得到文件大小,如果是19个字节,就跳过了,因为"no rows selected"加上其前后的换行符等,就刚好19bytes,这个方法其实不算高明,但够用了。😀

最后,如果文件大小不等于19bytes,那就直接把SQL输出的文件作为附件发出了。

我挺喜欢这种方式的,你呢?

参考资料:云和恩墨

没有评论: