prewind 发表于 2011-12-22 08:54

对于SPOOL数据的SQL

<DIV>
<P>关于SPOOL(SPOOL是SQLPLUS的命令,不是SQL语法里面的东西。)
<P></P>
<P>对于SPOOL数据的SQL,最好要自己定义格式,以方便程序直接导入,SQL语句如:<BR>select taskindex||'|'||commonindex||'|'||tasktype||'|'||to_number(to_char(sysdate,'YYYYMMDD')) from ssrv_sendsms_task;
<P></P>
<P>spool常用的设置<BR>set colsep' ';    //域输出分隔符<BR>set echo off;    //显示start启动的脚本中的每个sql命令,缺省为on<BR>set feedback off;  //回显本次sql命令处理的记录条数,缺省为on<BR>set heading off;   //输出域标题,缺省为on<BR>set pagesize 0;   //输出每页行数,缺省为24,为了避免分页,可设定为0。<BR>set termout off;   //显示脚本中的命令的执行结果,缺省为on<BR>set trimout on;   //去除标准输出每行的拖尾空格,缺省为off<BR>set trimspool on;  //去除重定向(spool)输出每行的拖尾空格,缺省为off <FONT color=#ffffff>IT技术社区bbs.ofAdmin.Com</FONT> </P>
<P>导出文本数据的建议格式:<BR>SQL*PLUS环境设置SET NEWPAGE NONE <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET HEADING OFF <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET SPACE 0 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET PAGESIZE 0 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET TRIMOUT ON <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET TRIMSPOOL ON <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET LINESIZE 2500 <FONT color=#ffffff>IT技术网Www.ofAdmin.Com</FONT> </P>
<P>注:LINESIZE要稍微设置大些,免得数据被截断,它应和相应的TRIMSPOOL结合使用防止导出的文本有太多的尾部空格。但是如果LINESIZE设置太大,会大大降低导出的速度,另外在WINDOWS下导出最好不要用PLSQL导出,速度比较慢,直接用COMMEND下的SQLPLUS命令最小化窗口执行。 <SPAN class=Cvk469>华夏网管Www.ofAdmin.Com</SPAN> </P>
<P>对于字段内包含很多回车换行符的应该给与过滤,形成比较规矩的文本文件。通常情况下,我们使用SPOOL方法,将数据库中的表导出为文本文件的时候会采用两种方法,如下述: <FONT color=#ffffff>网管Www.ofAdmin.Com</FONT> </P>
<P>方法一:采用以下格式脚本  <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set colsep '|'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --设置|为列分隔符 <BR>  set trimspool on <BR>  set linesize 120 <BR>  set pagesize 2000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>  set newpage 1 <BR>  set heading off&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>  set term off <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set num 18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set feedback off&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>  spool 路径+文件名 <BR>  select * from tablename; <BR>  spool off <FONT color=#ffffff>网管Www.ofAdmin.Com</FONT> </P>
<P>方法二:采用以下脚本 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set trimspool on <BR>  set linesize 120 <BR>  set pagesize 2000 <BR>  set newpage 1 <BR>  set heading off <BR>  set term off <BR>  spool 路径+文件名 <BR>  select col1||','||col2||','||col3||','||col4||'..' from tablename; <BR>  spool off <FONT color=#ffffff>网管论坛bbs.ofAdmin.Com</FONT> </P>
<P>比较以上方法,即方法一采用设定分隔符然后由sqlplus自己使用设定的分隔符对字段进行分割,方法二将分隔符拼接在SELECT语句中,即手工控制输出格式。 <FONT color=#ffffff>网管Www.ofAdmin.Com</FONT> </P>
<P>在实践中,发现通过方法一导出来的数据具有很大的不确定性,这种方法导出来的数据再由sqlldr导入的时候出错的可能性在95%以上,尤其对大批量的数据表,如100万条记录的表更是如此,而且导出的数据文件狂大。 </P>
<P>而方法二导出的数据文件格式很规整,数据文件的大小可能是方法一的1/4左右。经这种方法导出来的数据文件再由sqlldr导入时,出错的可能性很小,基本都可以导入成功。 <FONT color=#ffffff>网管网ofAdmin.Com</FONT> </P>
<P>因此,实践中我建议大家使用方法二手工去控制spool文件的格式,这样可以减小出错的可能性,避免走很多弯路。
<P></P>
<P><BR>
<P></P>spool_test.sh脚本如下:<BR>#!/bin/sh<BR>DB_USER=zxdbm_ismp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #DB USER<BR>DB_PWD=zxin_smap&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #DB PASSWORD<BR>DB_SERV=zx10_40_43_133&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #DB SERVICE NAME
<P></P>
<P>send_day=`sqlplus -s $DB_USER/$DB_PWD@$DB_SERV&lt;&lt;! #-s 参数屏蔽打印到屏幕上的其他信息,只显示sql执行信息<BR>set trimspool on<BR>set linesize 120<BR>set pagesize 2000<BR>set newpage 1<BR>set heading off<BR>set term off<BR>spool sp_test.txt<BR>select taskindex||'|'||commonindex||'|'||tasktype||'|'||to_number(to_char(sysdate,'YYYYMMDD')) from ssrv_sendsms_task;<BR>spool off<BR>/<BR>`</P>
<P><BR>执行./spool_test.sh后生成sp_test.txt,内容如下:<BR>83|115|1|20080307<BR>85|115|11|20080307<BR>86|115|10|20080307<BR>84|115|2|20080307<BR>6|5|14|20080307<BR>7|5|12|20080307<BR>9|5|15|20080307 <FONT color=#ffffff>网管网ofAdmin.Com</FONT> </P>
<P>set time off echo off head off<BR>set trimspool on <BR>set termout off<BR>set pagesize 0<BR>set colsep ","<BR>set trims on<BR>set trimout on;<BR>set feedback off<BR>spool d:\test.csv<BR>select rownum||','||empno||','||ename from emp;<BR>spool off <SPAN class=Cvk469>网管网ofAdmin.Com</SPAN></P></DIV>
页: [1]
查看完整版本: 对于SPOOL数据的SQL