LINUX之SHELL进行数据检查和调用存储过程

#!/bin/sh
#zlkh.sh
#增加对数据的校验 张明伟
nul="/dev/null";
dt=$(date +"%Y%m%d")
log=${0##*/};
tmpfile=/tmp/${log}_$RAMDOM
log=$HOME/zmw_data/logs/${log%%.*}.log

. $HOME/.bash_profile
export LANG=zh_CN
export LC_ALL=zh_CN
echo >>$log;
date >>$log;

monstr=${dt:0:6}01
nxtmss=$(date +"%Y%m%d" -d "$monstr +1 months ") 
monend=$(date +"%Y%m%d" -d "${nxtmss:0:6}01 -1 days ") 
maxccnt=100;
#datadate检查
filtersql="
SELECT DISTINCT a.DATADATE
FROM PLAT_DDDFN a 
WHERE a.DATADATE BETWEEN $monstr AND $monend
and a.DATADATE NOT IN (SELECT DISTINCT DATADATE FROM PLAT_ZLKH ) 
ORDER BY 1
";

db2 connect to zxjxdbs>$nul;
db2 -x "$filtersql" >$tmpfile;

while getopts "s:e:d:" opt
do
  case "$opt" in 
   "s") strdt=$OPTARG;;
   "e") enddt=$OPTARG;;
   "d") datadate=$OPTARG;;
   "a") autoflg="Y";;
   *) echo "Usage: ${0##*/} [ -s startdate -e enddate] [-d datadate] "
      exit;;
  esac
done 

#20311230 张明伟 改造成函数
call_cycle()
{
    sstrdt=$1;
    senddt=$2;
    while [ $sstrdt -le $senddt ]
    do
      echo strdate is $sstrdt enddate is $senddt | tee -a $log;
      echo db2 -x "call pc_zlkh(?,?,?,?,$sstrdt)";
      d=0
      i=1
      #common exe time is 30 secs
      while [ $d -le 30 -a $i -lt $maxccnt ]
      do
       if [ $i -gt 1 ];then
         sleep 300
       fi
    
       db2 connect to zxjxdbs>$nul;
       date >>$log;
       dts=$(date +"%Y%m%d%H%M%S")
       db2 -x "call pc_zlkh(?,?,?,?,$sstrdt)" >>$log;
       dte=$(date +"%Y%m%d%H%M%S")
       d=$((dte-dts))
       echo db2 -x "call pc_zlkh(?,?,?,?,$sstrdt)" 运行第 $i 次 | tee -a $log;
       echo "pc_zlkh(?,?,?,?,$sstrdt)运行时长为:$((d/3600))小时$((d/60))分$((d%60))秒" | tee -a $log;
       db2 connect reset>$nul;
       db2 terminate>$nul;
       i=$((i+1)) 
      done
    
      sstrdt=$(date -d "$sstrdt +1 days"  +"%Y%m%d")
    done
}


if [ "$strdt" = "" -a "$datadate" = "" ];then
  datadate=$(date -d " -1 days"  +"%Y%m%d")
fi;

if [ "$strdt" = "" -o "$enddt" = "" ];then
  echo "enddt is null,please input then -s or -e argument"
  strdt=$datadate
  enddt=$datadate
  call_cycle $strdt $enddt
  exit;
fi;

#检查文件,如果有遗漏数据,进行处理
if [ -s $tmpfile ]
then
    while read line
    do
      if [ ${line:0:2} -eq 20 ]
      then 
         call_cycle $line $line;
      fi;
    done<$tmpfile;
    exit;
fi;


rm -f $tmpfile;

 

posted @ 2020-04-04 15:18  silencemaker1221  阅读(816)  评论(0编辑  收藏  举报