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打开。。)
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打开。。)
spool ${var_csv_name}2.spool自动分成多个文件没有做过,不过你可以通过修改sql来实现分段存放。1和2一起在脚本里面使用一个循环
.....确实是一个shell脚本,能把详细的帮我写一下吗,shell和sqlplus之间互相传值还不是很清楚。。
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
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:脚本未测试仅供参考,楼主可按需要对脚本的输入参数、日志打印等进行量身定做:)