#!/bin/sh
. $(dirname "$0")/public_s.sh
#张明伟
#本shell适合有传出参数的标准存储过程
#v1.1 张明伟 20150107
dt=$(date -d "-1 days " +"%Y%m%d")
log=${0##*/};
log=$HOME/zmw_data/logs/${log%%.*}_$dt.log
cd ~/zmw_data
lastyend=$pub_lastyearend;
#本日为1月27号,取上年底
if [ ${dt:4:4} -ge 127 ]
then
i_dt_e=${dt:0:4}0101
lastyend=$(date -d "$i_dt_e -1 days" +"%Y%m%d" )
fi;
echo lastyend is $lastyend | tee -a $log;
debug="N" #是否调试
bkflg="N" #表备份标志
datatype="M" #日期类型,M表示月数据,D表示日数据
dt_sub="";
#运行存储过程及判断是否成功,失败则循环运行直到成功
exec_tmpfile()
{
proc_tmp=$1; #存储过程
date_tmpflg=$2; #日期参数
extp=$3; #扩展参数
while true
do
#执行存储过程
dtss1=$(date +"%Y%m%d%H%M%S")
dtss=$(date +"%s")
echo $dtss1 | tee -a $log;
db2 connect to zxjxdbs >$pub_nul;
tmp_rf=logs/$$_file;
touch $tmp_rf;
if [ ${#date_tmpflg} -eq 0 ];then
db2 -x "call $proc_tmp(?,?,?,?$extp)" >$tmp_rf;
else
db2 -x "call $proc_tmp(?,?,?,?,$date_tmpflg$extp)" >$tmp_rf;
fi;
dtse1=$(date +"%Y%m%d%H%M%S")
dtse=$(date +"%s")
echo $dtse1 | tee -a $log;
cat $tmp_rf>>$log;
d_sub=$((dtse-dtss))
echo "$proc_tmp(?,?,?,?,$date_tmpflg$extp)运行时长为:$((d_sub/3600))小时$((d_sub/60))分$((d_sub%60))秒" | tee -a $log;
#结果判断
#原失败判断标志改为成功判定标志
stext="Parameter Value : 0";
res_tmp=` grep -iE "Success|$stext" $tmp_rf | tr -d ' ' `;
if [ "$res_tmp" != "" ];then
#成功则进行下一步操作,否则继续运行
echo "$proc_tmp 运行成功" | tee -a $log;
rm -f $tmp_rf>$pub_nul;
break;
fi;
echo ".....isquiet is $isquiet";
[ "$isquiet" != "Y" ] && echo "是否需要跑其它的?";
echo "$proc_tmp 运行失败,继续运行!" | tee -a $log;
rm -f $tmp_rf>$pub_nul;
sleep 15;
done;
}
#调用函数
call_p()
{
ar="$1"
dts="$2"
extendpss="$3"
echo "存储过程参数为:$ar" | tee -a $log;
echo "月日期参数为:$dts" | tee -a $log;
echo "附加参数为:$extendpss" | tee -a $log;
if [ ${#dts} -eq 0 ];then
echo "db2 -x call $ar(?,?,?,?$extendpss)" | tee -a $log
db2 connect to zxjxdbs>$pub_nul;
if [ "$debug" != "Y" ];then
exec_tmpfile $ar $dts;
fi;
fi;
if [ ${#extendpss} -gt 0 -a ${#dts} -gt 0 ];then
echo "db2 -x call $ar(?,?,?,?,$dts$extendpss)" | tee -a $log
db2 connect to zxjxdbs>$pub_nul;
if [ "$debug" != "Y" ];then
exec_tmpfile $ar $dts "$extendpss";
fi;
fi;
for d in $dts
do
echo d is $d.......
if [ $d -lt 0 ];then
d=",$d"
echo "数据日期为:$d" | tee -a $log
fi;
dt_sub=$d;
i=0;
for a in $ar
do
#echo -n "是否确定跑此存储过程:$a..[y/n]:"
#read yn
yn='Y';
ryn=`echo $yn | tr 'a-z' 'A-Z' `
# echo $ryn
tb=${art[i]}
if [ $d -eq $lastyend -a "$a" = "PC_ZLKH" ]
then
continue;
fi;
a=` echo "$a" | tr 'a-z' 'A-Z' `;
xpc=` echo "$xpc" | tr 'a-z' 'A-Z' `;
if [ "$a" = "$xpc" ]
then
continue;
fi;
dtime=$(date +"%Y%m%d%H%M%S")
db2 connect to zxjxdbs>$pub_nul;
if [ ! -e "bak/${tb}_${d}*.del" -a "$tb" != "" -a "$bkflg" = "Y" -a "$debug" != "Y" ]
then
echo db2 "export to bak/${tb}_${d}_$dtime.del of del select * from $tb where datadate=$d" | tee -a $log;
if [ "$debug" != "Y" ]
then
db2 "export to bak/${tb}_${d}_$dtime.del of del select * from $tb where datadate=$d" | tee -a $log;
gzip bak/${tb}_${d}_$dtime.del &
fi;
fi;
if [ "$ryn" = "Y" ];then
echo "db2 -x call $a(?,?,?,?,$d$extendpss)............" | tee -a $log
if [ "$debug" != "Y" ];then
#db2 -x "call $a(?,?,?,?,$d)" | tee -a $log
exec_tmpfile "$a" "$dt_sub" "$extendpss"
fi;
elif [ "$ryn" = "N" ];then
echo "db2 -x call $a(?,?,?,?,$d$extendpss) is not run!" | tee -a $log
if [ "$debug" != "Y" ];then
#db2 -x "call $a(?,?,?,?,$d) is not run!" | tee -a $log
exec_tmpfile "$a" "$dt_sub" "$extendpss"
fi;
elif [ "$ryn" = "Q" ];then
echo "quit!"
exit;
fi;
i=$((i+1))
db2 connect reset>$pub_nul;
db2 terminate>$pub_nul;
done;
done;
}
count_i=0;
datechk()
{
dc_date=$1;
if [ ${#dc_date} -gt 0 ]
then
if [[ $dc_date -lt 19000101 || $dc_date -gt 29991231 ]]
then
echo "日期$dc_date无效!" | tee -a $log;
count_i=$((count_i+1));
exit;
fi;
fi;
}
#日期参数,一定要按顺序排列
#dtms=" 20130131 20130228 20130331 20130430 20130531 20130630 20130731 20130831 20130930 20131031 20131130 20131231 "
pub_datatype="M";
if [ $lastyend -eq $pub_lastmend ]
then
getlastyearend $lastyend;
lastyend="$pub_result";
fi;
fc_getdayebtw $lastyend $pub_lastmend
dtms="$pub_result";
#命令交互入口
while getopts "s:e:d:p:b:gt:i:x:z:jaE:" opt
do
case "$opt" in
"s") strdt=$OPTARG;; #开始日期
"t") datatype=$OPTARG;; #日期类型
"p") procs=$OPTARG;;
"x") extendp=$OPTARG;;
"z") xpc=$OPTARG;;
"e") enddt=$OPTARG;;
"i") incr=$OPTARG;; #时间步长
"d") datadate=$OPTARG;;
"j") jxflg="Y";; #每月27号绩效数据
"g") debug="Y";;
"b") bkflg=$OPTARG;;
"a") autoflg="Y";;
"E") excluop="$OPTRAG";;
*) echo "Usage: ${0##*/} [-g] [-t datatype:M/D] [-p procname] [-a] [ -s startdate -e enddate] [-d datadate] "
exit;;
esac
done
if [ "$jxflg" = "Y" -a "$bkflg" = "" ]
then
bkflg="Y";
fi;
call_usage()
{
echo "Usage: ${0##*/}
[-g] out the debug commands
[-j] excute the managers d&l between yearstart and lastmonths
[-t datatype] M or D
[-p procname] procedurece anem
[-a] autobak flag Y/N
[-s startdate -e enddate]
[-d datadate]
[-x] extend arguments
"
}
datechk $strdt;
datechk $enddt;
datechk $datadate;
[ "$debug" = "Y" ] && log=$pub_null && echo "at debug status!";
echo | tee -a $log;
date | tee -a $log;
if [ $count_i -gt 0 ]
then
echo "日期输入有误,请检查!" | tee -a $log;
exit;
fi;
#1.重新跑绩效前的准备
#上月末
lastmon=${dt:0:6}01
lastmon=$(date -d "$lastmon -1 days " +"%Y%m%d")
lastwek=$(date -d "$dt -7 days " +"%Y%m%d")
lastday=$(date -d "$dt -1 days " +"%Y%m%d")
#若指定数据日期,则不运行以下过程
if [ "$strdt" != "" ]
then
cut_dtms=0;
for sub_dtms in $dtms
do
#echo $sub_dtms
if [ $sub_dtms -ge $strdt ]
then
cut_dtms=$sub_dtms;
break;
fi;
done;
t_dtms=$cut_dtms" "${dtms##*${cut_dtms}};
if [ "$enddt" != "" ]
then
t_dtms=${t_dtms%%${enddt}*}" "$enddt;
fi;
dtms="$t_dtms";
#若指定数据日期,则重新写月日期参数变量
elif [ "$datadate" != "" ]
then
strdt=$datadate
enddt=$datadate
dtms=$datadate;
elif [ "$autoflg" = "Y" ]
then
strdt=$dt
enddt=$dt
dtms=$dt;
else
echo "";
fi;
[ "$dtms" != "" ] && datatype="D";
[ "$jxflg" = "Y" ] && datatype="M";
[ "$incr" = "" ] && incr=1;
echo "datatype is $datatype.........."
[ "$jxflg" = "Y" -a "$strdt" = "" ] && strdt=$lastyend && enddt=$lastmon;
datatype=$(echo $datatype | tr 'a-z' 'A-Z');
echo "datatype is $datatype"
if [ "$datatype" = "D" -o "$datatype" = "M" ]
then
if [ "$strdt" = "" -o "$enddt" = "" ]
then
echo "请输入开始时间和结束时间参数!"
call_usage;
exit;
fi;
ds_1=$strdt
de_1=$enddt
dtms="";
while [ $ds_1 -le $de_1 ]
do
if [ "$datatype" = "M" ]
then
ds_1=${ds_1:0:6}01
#echo ds_1 is $ds_1
ds_1=$(date -d "$ds_1 + $incr months " +"%Y%m01" )
ds_1=$(date -d "$ds_1 - $incr days " +"%Y%m%d" )
#echo "datatype is $datatype and ds_1 is $ds_1"
fi;
[ $ds_1 -le $de_1 ] && dtms="$dtms $ds_1"
ds_1=$(date -d "$ds_1 +$incr day " +"%Y%m%d");
done;
echo $dtms .....
fi;
#添加除了每个月末外的上周,昨天,今天
if [ "$jxflg" = "Y" -a "$strdt" = "$lastyend" -a "${lastday:0:4}" = "${lastyend:0:4}" ]
then
echo "开始算绩效了!!!" | tee -a $log;
dtms="$dtms $lastwek $lastday $dt";
fi;
if [ "$procs" = "" -a "$strdt" = "$lastyend" ]
then
#0.1分成关系重跑过程
aro=( PC_GENEMPSPLTRLT )
call_p "$aro" ;
aro=( PC_EMPMSTKPI_DEPYS )
call_p "$aro" ;
fi;
echo "新月日期参数为 dtms is :$dtms" | tee -a $log;
#2.跑入其它对公存储过程
aro=" PC_EMPWMSTKPI PC_EMPRMSTKPI PC_EMPMSTKPI_U PC_ACCRSKSTC2Q PC_ACCINFO_SHZX PC_KHJLFZYWJS PC_ZLKH PC_KHJL_GM"
if [ "$procs" != "" ]
then
aro="$procs";
extendps="$extendp";
fi;
#备份表数组
art=( PLAT_EMPWMSTKPI PLAT_EMPRMSTKPI PLAT_EMPMSTKPI_U PLAT_ACCINFOSH )
call_p "$aro" "$dtms" "$extendps"
[ "$jxflg" == "Y" ] && echo "绩效已经算完了!!!" | tee -a $log;
#3.交通费,张军的营销费
exit;
if [ "$datadate" = "" -o "$autoflg" = "Y" ];then
datadate=$(date -d " -1 days" +"%Y%m%d")
strdt=$datadate
enddt=$datadate
else
strdt=$datadate
enddt=$datadate
fi;
if [ "$strdt" != "" -a "$enddt" = "" ];then
echo "enddt is null,please input then -e argument"
exit
fi;
while [ $strdt -le $enddt ]
do
echo strdate is $strdt enddate is $enddt
echo db2 -x "call pc_zlkh($strdt)" | tee -a $log;
d=0
i=1
while [ $d -le 5 -a $i -lt 10 ]
do
if [ $i -gt 1 ];then
i=$((i+1))
sleep 300
fi
db2 connect to zxjxdbs>$pub_nul;
db2 "export ${ard[i]} to ${art[i]}$dtime.del of del select * from ${ard[i]}$dtime where datadate=$strdt" | tee -a $log;
dts=$(date +"%Y%m%d%H%M%S")
db2 -x "call pc_zlkh($strdt)" >>$log;
dte=$(date +"%Y%m%d%H%M%S")
d=$((dte-dts))
echo db2 -x "call pc_zlkh($strdt)" 运行第 $i 次 | tee -a $log;
echo "pc_zlkh($strdt)运行时长为:$((d/3600))小时$((d/60))分$((d%60))秒" | tee -a $log;
db2 connect reset>$pub_nul;
db2 terminate>$pub_nul;
done
strdt=$(date -d "$strdt +1 days" +"%Y%m%d")
done