在用spool 导出数据的时候,如果直接导成excel, 那么在格式上比较路,比如一个字段占了2列,这个还是好的,有的占了办列,这个格式看上去还是很麻烦的,所以我们可以使用sqlplus 的markup 命令, 直接导出成网页形式的,这样在格式上要整齐很多。
关于sqlplus 和 spool,可以参考我的2篇blog:
Oracle sqlplus 常用命令总结
http://blog.csdn.net/tianlesoftware/archive/2009/12/20/5040984.aspx
Linux 平台下 Spool导出数据并发送到邮箱
http://blog.csdn.net/tianlesoftware/archive/2010/01/23/5224489.aspx
语法:
SET MARK[UP] HTML [ON | OFF] [HEAD text] [BODY text] [TABLE text] [ENTMAP {ON | OFF}] [SPOOL {ON | OFF}] [PRE[FORMAT] {ON | OFF}]
SET MARKUP指明SQL*Plus输出HTML编码格式,必须使用SET MARKUP HTML ON SPOOL ON和SQL*Plus SPOOL命令去创建一个spool文件,并且以HTML格式输出。
SET MARKUP习惯称作SQLPLUS -MARKUP命令。
使用SQLPLUS -MARKUP HTML ON或者SQLPLUS -MARKUP HTML ON SPOOL ON 产生标准的web页,SQL*Plus 自动生成完整的用<HTML>和<BODY>标签封装HTML网页。 当设定SPOOL OFF或者退出SQL*Plus是,spool文件中的HTML标签就闭合。
SQLPLUS -MARKUP和一些其他有用的静默和限制命令一起用。
使用MARKUP HTML ON生成HTML输出,无论是<PRE>标签还是一个HTML表格。输出一个表格使用标准的HTML <TABLE>, <TR> 和 <TD> 标签,自动闭合从一个查询返回结果集的行和列。当设置HTML ON时,默认产生标准HTML表格。通过设置PREFORMAT ON产生预格式化HTML <PRE> 标签。
用SHOW MARKUP命令查看MARKUP操作当前状态:
SQL> show markup
markup HTML OFF HEAD "<style type='text/css'> body {font:10pt Arial,Helvetica,sans-serif; color:black; background:White;}
HTML [ON|OFF]
指定是否生成HTML格式,ON生成,OFF不生成,默认是OFF。
HEAD text
指定HTML中HEAD标签中的内容,默认情况下,文本包括级联样式和标题。
BODY text
指定HTML中BODY标签属性
TABLE text
设置<TABLE>标签的属性,如BORDER, CELLPADDING, CELLSPACING和WIDTH.。默认情况下,<TABLE> 的WIDTH属性设置为90%,BORDER属性设置为1。
ENTMAP {ON|OFF}
指定在SQL * Plus中是否用HTML字符实体如<, >, " and &等替换特殊字符<, >, " and & 。默认设置是ON。例如:
SQL> set markup html on entmap off
SQL>
<br>
SQL> set markup html on entmap on
<br>
SQL>
<br>
SQL>
SPOOL {ON|OFF}
指定是否在SQL*Plus生成HTML标签<HTML> 和<BODY>, </BODY> 和</HTML>。默认是OFF。
注:
这是一个后台打印操作,只有在生成SPOOL文件生效,在屏幕上并不生效。
PRE[FORMAT] {ON|OFF}
指定SQL*Plus生成HTML时输出<PRE>标签还是HTML表格,默认是OFF,因此默认输出是写HTML表格。
在生成HTML格式时要设置一些其他操作,列出如下:
SET ECHO {ON|OFF}
是否显示脚本中正在执行的SQL语句。
SET FEED[BACK] {6|n|ON|OFF}
.是否显示当前sql语句查询或修改的行数。默认只有结果大于6行时才显示结果的行数。如果set feedback 1 ,则不管查询到多少行都返回。当为off 时,一律不显示查询的行数。
SET HEA[DING] {ON|OFF}
是否显示列标题。当SET HEADING OFF时,在每页的上面不显示列标题,而是以空白行代替。
SET LIN[ESIZE] {80|n}
设置一行可以容纳的字符数。如果一行的输出内容大于设置的一行可容纳的字符数,则折行显示。
SET NEWP[AGE] {1|n|NONE}
设置页与页之间的分隔。
当SET NEWPAGE 0 时,会在每页的开头有一个小的黑方框。
当SET NEWPAGE n 时,会在页和页之间隔着n个空行。
当SET NEWPAGE NONE 时,会在页和页之间没有任何间隔。
SET NULL text
显示时,用text值代替NULL值
SET PAGES[IZE] {24|n}
设置一页有多少行数,如果设为0,则所有的输出内容为一页并且不显示列标题
SET WRA[P] {ON|OFF}
当SQL语句的长度大于LINESIZE时,是否在显示时截取SQL语句,设置SET WRAP ON时,输出行的多于的字符会另起一行显示,否则,会将输出行的多于字符切除,不予显示。
SET TERM[OUT] {ON|OFF}
是否在屏幕上显示输出的内容, 主要用与SPOOL结合使用。设置SET TERMOUT OFF,输出的内容只保存在输出文件中,不会显示在屏幕上,提高了SPOOL输出速度。
SET TRIMS[OUT] {ON|OFF}
将SPOOL输出中每行后面多余的空格去掉
示例:
#####################################################################
## 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
cd /u03/scripts
sqlplus -s user/pwd@sid <<EOF
set numwidth 20
set heading off
Set pagesize 0
Set term off
Set feedback off
set linesize 99999
set trimspool off
set term off verify off feedback off pagesize 9999
set markup html on entmap ON spool on preformat off
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'), to_char
(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
#sendMail
uuencode 000001info.xls 000001info.xls|mailx -s "000001每日内部通讯,如有疑问请联系IT" Dave@tianlesoftware.com