简易版:
sqlplus -s scott/tiger@orcl<<EOF
#不显示执行结果,还是让他显示吧!set echo off feedback off heading off underline off;
@/home/test.sql;
exit;
EOF
升级版:【串行执行】读取sql文件夹下的所有.sql文件并执行。
这种方法一次只能执行一个脚本,执行完一个才能继续往下执行。
p=`pwd`
cd ${p}/sql
files=`ls|awk -F: '{print $1}'`
index=0
for f in ${files[@]}
do
echo ${f}
sqlplus -s scott/tiger@orcl<<EOF
@${p}/sql/${f};
exit;
EOF
let index++
done
尊享版:【并发执行】并行跑完一个后,生成.done文件。
可以实现跟踪执行状态,test.sql执行中会生成 test.doing文件,执行完毕,删除test.doing,并且创建test.done。
p=`pwd`
cd ${p}/sql
files=`ls|grep .sql|awk -F: '{print $1}'`
index=0
for f in ${files[@]}
do
{
echo ${f}
file=`echo ${f}|awk -F "." '{print $1}'`
touch ${file}.doing
sqlplus -s scott/tiger@orcl<<EOF
@${p}/sql/${f};
exit;
EOF
cp ${f} ${file}.done
rm ${file}.doing
######rm ${f}
} &
let index++
done
最终版:并发执行/执行过程记录.doing,结束记录.done/跳过存在.done的sql文件
p=`pwd`
cd ${p}/sql
files=`ls|grep .sql|awk -F: '{print $1}'`
index=0
for f in ${files[@]}
do
{
echo ${f}
file=`echo ${f}|awk -F "." '{print $1}'`
donefile="${p}/sql/${file}.done"
if [ -f ${donefile} ];then
echo "This file has been executed.--${file}.sql"
continue
else
touch ${file}.doing
sqlplus -s scott/tiger@orcl<<EOF
@${p}/sql/${f};
exit;
EOF
cp ${f} ${file}.done
rm ${file}.doing
fi
} &
let index++
done
完全原创,欢迎指正!
另外,对于并发数的控制,我还没有找到解决办法。因为oracle默认连接数是150,我一次也就执行10几个脚本,因此,我就放弃了控制并发数限制。