set echo off
set feedback off
set trimspool on 
set linesize 300 
set pagesize 0
set newpage 1 
set heading off
set trimout on
set termout off
spool /home/oracle/data/monthdetail/qf.csv
select 地市||','|| 区号||','|| 用户标示 from table_a;
spool off;
exit;
EOF
echo `date` >> ./getdate.log
echo ''run ok'' >> ./getdate.log请教2个问题
1.如何能让spool /home/oracle/data/monthdetail/qf.csv  自动导成 qfyyyymmdd.csv文件名2.由于数据量过大超过40万条。。怎么能分开导成多个文件,每个文件60000条(主要是业务部门只会EXCEL,所以必须用EXCEL打开。。)

解决方案 »

  1.   

    用split -l 60000 qf.csv来分割文件
      

  2.   

    1.看起来好像是shell脚本,可以把/home/oracle/data/monthdetail/qf.csv这个设置成一个变量var_csv_name,取时间值,然后传入
    spool ${var_csv_name}2.spool自动分成多个文件没有做过,不过你可以通过修改sql来实现分段存放。1和2一起在脚本里面使用一个循环
      

  3.   

    $ORACLE_HOME/bin/sqlplus */*<<EOF>>./getdate.log
    .....确实是一个shell脚本,能把详细的帮我写一下吗,shell和sqlplus之间互相传值还不是很清楚。。
      

  4.   

    select '/home/oracle/data/monthdetail/qf'||to_char(sysdate,'yyyymmddhh24mi')||'.csv' dat1 from dual;spool \&dat1第一列已经正确显示了,但第二列还是不行,那位高手帮看看错误提示:
    SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> /home/oracle/data/monthdetail/qf200908121219.csv
    SQL> SQL> Enter value for dat1: SP2-0768: Illegal SPOOL command
    Usage: SPOOL { <file> | OFF | OUT }
    where <file> is file_name[.ext] [CRE[ATE]|REP[LACE]|APP[END]]
    SQL> not spooling currently
    SQL> SQL> Disconnected from Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options
    Wed Aug 12 12:19:03 CST 2009
    run ok
      

  5.   

    结合楼上几位同志的方法,楼主可参考下脚本:
    1.spool_data.sql
    说明:文件名和表名作为输入参数
    set echo off
    set feedback off
    set trimspool on
    set linesize 300
    set pagesize 0
    set newpage 1
    set heading off
    set trimout on
    set termout off
    spool &1
    select 地市||','|| 区号||','|| 用户标示 from &2;
    spool off;
    exit;
    2.run_spool_data.sh
    说明:简单地封装sqlplus执行spool导出数据,这里可以设置导出文件路径,文件前缀,分割文件大小等
    #!/bin/sh
    DB_CONNECT=$1
    TABNAME=$2# init
    DIR_DATA=/home/oracle/data/monthdetail/
    FILE_SUFFIX=qf
    CURRENT_DATE=date +"%Y%m%d"
    CURRENT_DIR=`pwd`
    FILE_NAME=${FILE_SUFFIX}_${CURRENT_DATE}cd ${DIR_DATA};mkdir ${CURRENT_DATE};cd ${CURRENT_DATE}#spool data
    sqlplus ${DB_CONNECT} @spool_data.sql ${FILE_NAME} ${TABNAME} > ${FILE_NAME}.log#split file
    split -l 60000 -a 1 ${FILE_NAME} ${FILE_NAME}_# rename file name
    ls ${FILE_NAME}*|while read name; do mv $name $name.csv; done;# go back
    cd ${DIR_DATA}
    3.执行
    nohup run_spool_data.sh scott/tiger@prod scott.emp生成的文件格式:qf_200901_a.csv,qf_200901_b.csv...,。。
    顺便提下split的时候指定了-l 60000 -a 1,如果输出文件比预期大,需要调整这个参数PS:脚本未测试仅供参考,楼主可按需要对脚本的输入参数、日志打印等进行量身定做:)
      

  6.   

    生成的文件格式:qf_20090101_a.csv,qf_20090101_b.csv...,。。