关于SPOOL(SPOOL是SQLPLUS的命令,不是SQL语法里面的东西。)

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

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

导出文本数据的建议格式: 
SQL*PLUS环境设置SET NEWPAGE NONE 
                SET HEADING OFF 
                SET SPACE 0 
                SET PAGESIZE 0 
                SET TRIMOUT ON 
                SET TRIMSPOOL ON 
                SET LINESIZE 2500

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

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

方法一:采用以下格式脚本  
        set colsep '|'               --设置|为列分隔符 
  set trimspool on 
  set linesize 120 
  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文件的格式,这样可以减小出错的可能性,避免走很多弯路。

自测例:将ssrv_sendsms_task表中的数据导出到文本(数据库Oracle 9i  操作系统 SUSE LINUX Enterprise Server 9)

spool_test.sh脚本如下: 
#!/bin/sh 
DB_USER=zxdbm_ismp                               #DB USER 
DB_PWD=zxin_smap                                 #DB PASSWORD 
DB_SERV=zx10_40_43_133                           #DB SERVICE NAME

sqlplus -s $DB_USER/$DB_PWD@$DB_SERV<<EOF # -s 参数屏蔽打印到屏幕上的其他信息,只显示sql执行后从DB中查询出来的信息,过滤掉spool函数执行时在文件中写入的其他信息。 
set trimspool on 
set linesize 120 
set pagesize 2000 
set newpage 1 
set heading off 
set term off 
spool promt.txt 
select taskindex||'|'||commonindex||'|'||tasktype||'|'||to_number(to_char(sysdate,'YYYYMMDD')) from ssrv_sendsms_task; 
spool off 
EOF

执行./spool_test.sh后生成sp_test.txt,内容如下: 
83|115|1|20080307 
85|115|11|20080307 
86|115|10|20080307 
84|115|2|20080307 
6|5|14|20080307 
7|5|12|20080307 
9|5|15|20080307

注:上面自测例中,spool promt.txt中的目标生成文件promt.txt,在HP-UNX环境下的shell脚本中调用Oracle的spool函数,如果将上述逻辑代码封装为一个function,然后来调用这个function的话,则在shell脚本中最终是不会生成promt.txt文件的。只能直接执行逻辑代码,封装后则spool函数失效。 
          对于promt.txt在相对路径下,下面2中方法在shell环境中执行时,两者只能择一,两者并存则spool函数会失效。假设promt.txt文件生成的路径为:/home/zxin10/zhuo/batchoperate/spoolfile 
方式[1] 
echo "start spool in shell.."

sqlplus -s zxdbm_ismp/zxin_smap<<EOF 
set pagesize 0 
set echo off feed off term off heading off trims off 
set colsep '|' 
set trimspool on 
set linesize 10000 
set trimspool on 
set linesize 120 
set newpage 1 
spool /home/zxin10/zhuo/batchoperate/spoolfile/promt.txt 
select batchindex||'|'||productid||'|'||contentid||'|'||optype||'|'||uploadfile from zxdbm_700.s700_batch_operation where status=1; 
spool off 
EOF 
echo "end.." 
方式[2] 
echo "start spool in shell.." 
cd /home/zxin10/zhuo/batchoperate/spoolfile 
sqlplus -s zxdbm_ismp/zxin_smap<<EOF 
set pagesize 0 
set echo off feed off term off heading off trims off 
set colsep '|' 
set trimspool on 
set linesize 10000 
set trimspool on 
set linesize 120 
set newpage 1 
spool promt.txt 
select batchindex||'|'||productid||'|'||contentid||'|'||optype||'|'||uploadfile from zxdbm_700.s700_batch_operation where status=1; 
spool off 
EOF 
echo "end.."

oracle spoof用法的更多相关文章

  1. ORACLE RETURNING 用法总结

    ORACLE RETURNING 用法总结 场景 在存储过程.PL/SQL块里需要返回INSERT.DELETE.UPDATE.MERGE等DML语句执行后的信息时使用,合理使用returning能够 ...

  2. Oracle instr用法

    1:实现indexOf功能,.从第1个字符开始,搜索第1次出现子串的位置 ,) as i from dual; select instr('oracle','or') as i from dual; ...

  3. Oracle minus用法详解及应用实例

    本文转载:https://blog.csdn.net/jhon_03/article/details/78321937 Oracle minus用法 “minus”直接翻译为中文是“减”的意思,在Or ...

  4. Oracle触发器用法实例详解

    转自:https://www.jb51.net/article/80804.htm. 本文实例讲述了Oracle触发器用法.分享给大家供大家参考,具体如下: 一.触发器简介 触发器的定义就是说某个条件 ...

  5. ORACLE SEQUENCE用法(转)

    ORACLE SEQUENCE用法 在oracle中sequence就是序号,每次取的时候它会自动增加.sequence与表没有关系. 1.Create Sequence     首先要有CREATE ...

  6. [转载]Oracle触发器用法实例详解

    本文实例讲述了Oracle触发器用法.分享给大家供大家参考,具体如下: 一.触发器简介 触发器的定义就是说某个条件成立的时候,触发器里面所定义的语句就会被自动的执行. 因此触发器不需要人为的去调用,也 ...

  7. Oracle数据库用法汇总

    一些Oracle数据库用法的小总结 1.使用insert into创建新表 insert into destdb.sub_contract (userid,contractid) select msi ...

  8. oracle sqlloader 用法

    向oracle中导入*.csv文件   1.什么是*.csv,如何得到? 里面存放的是数据表.每行代表数据库表格的一行, 每行中,每两个数据中间由逗号","分割. *.csv可以通 ...

  9. Oracle Hint 用法

    正确的语法是: select /*+ index(x idx_t) */ * from t x where x.object_id=123 /*+    */ 和注释很像,比注释多了一个“+”,这就是 ...

随机推荐

  1. CSU 1808 地铁

    题意: ICPCCamp 有 n 个地铁站,用 1,2,-,n 编号. m 段双向的地铁线路连接 n 个地铁站,其中第 i 段地铁属于 ci 号线,位于站 ai,bi 之间,往返均需要花费 ti 分钟 ...

  2. webservice 远程调试配置

    在.NET 中已经默认将WEBSERVICE的远程调试功能关闭,有的时候我们需要远程调试程序的时候,就需要打开此功能我们只需在WEBSERVICE的项目的中添web.config的<system ...

  3. CSS 规划

    1)在拿到psd效果图后,我会将所有的效果图看一遍,然后开始打草稿,在纸上画,在PS中标注都可以.一般都是做个大概的统计,太详细不太现实,既费时间也费精力. 2)网站的浏览器兼容性要顾及到哪些,IE6 ...

  4. Intel Core i7的整体操作

    Intel Core i7的整体操作(我们也称呼为Nehalem,他的项目代码名) 主要分成2个部分-指令控制单元Instruction Control Unit(ICU),负责从存储器读出指令序列, ...

  5. codeforces 519E A and B and Lecture Rooms(LCA,倍增)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud E. A and B and Lecture Rooms A and B are ...

  6. maven配置spring mvc+hibernate+spring框架

    作为一名刚出茅草屋的新手小白写的框架,仅适合新手小白借鉴,大神勿喷,谢谢...... 前天刚知道spring mvc这个框架现在也很流行,决定用它代替struts2来写我的毕业设计. ...作为一名新 ...

  7. 50个必备的实用jQuery代码段+ 可以直接拿来用的15个jQuery代码片段

    50个必备的实用jQuery代码段+ 可以直接拿来用的15个jQuery代码片段 本文会给你们展示50个jquery代码片段,这些代码能够给你的javascript项目提供帮助.其中的一些代码段是从j ...

  8. BeanUtils包的学习

    BeanUtils支持八种基本数据类型(int double short char byte float boolean long)的反射,对于日期需要提前注册DateLocalConvert获取转换 ...

  9. python模范发送邮件的时候,才smtp.connect的时候总是抛出错误

    python发送邮件的时候,总是出现:[Errno 10060] 错误码 根据debug得到在connect的时候出错. 认真检查了下host,没有错呀~应该就是服务器的host. 查看了下网上的一些 ...

  10. Java 正则提取数字串

    例如:有一个字符串:"数量最低2000份",将其中的2000数字提取出来. String arg0 = "数量最低2000份"; Pattern p = Pat ...