shell脚本批量调度Oracle存储过程

本程序批量调度Oracle存储过程,支持定时调度任务,处理存储过程调度过程中的依赖关系。

1. run_prc.sh

#!/bin/bash
#author zhangbingkai
#2018.10.14

v_prc_call=$1
v_date=$2
shell_dir=$3
V_ORACLE_HOME=`cat $shell_dir/parameter.ini | grep ORACLE_HOME`
V_ORACLE_SID=`cat $shell_dir/parameter.ini | grep ORACLE_SID`
export ORACLE_HOME=${V_ORACLE_HOME:12}
export ORACLE_SID=${V_ORACLE_SID:11}
export PATH=$PATH:$ORACLE_HOME/bin
v_dblogin=`cat $shell_dir/parameter.ini | grep dblogin`
dblogin=${v_dblogin:8}
 status=`$ORACLE_HOME/bin/sqlplus -S $dblogin <<EOF
  set pagesize 0 feedback off verify off heading off echo off linesize 5000 
  UPDATE JOB_PRC_NAME SET STATUS = 'RUN' WHERE PRC_NAME = '$v_prc_call';
  COMMIT;
  call $v_prc_call('$v_date');
  exit
EOF`
#execute success
if [ -z "$status" ]; then
  $ORACLE_HOME/bin/sqlplus -S $dblogin <<EOF
  set pagesize 0 feedback off verify off heading off echo off linesize 5000 
  UPDATE JOB_PRC_NAME SET STATUS='SUC',MESSAGE='SUCCESS' WHERE PRC_NAME = '$v_prc_call';
  COMMIT;
  exit
EOF
fi
if [ -n "$status" ]; then
  info=`echo $status |sed "s/'/''/g"`
#   echo $info >> test.txt
  $ORACLE_HOME/bin/sqlplus -S $dblogin <<EOF
  set pagesize 0 feedback off verify off heading off echo off linesize 5000 
  UPDATE JOB_PRC_NAME SET STATUS='ERR', MESSAGE = 'ERROR:'||substr('$info',1,200) WHERE PRC_NAME = '$v_prc_call';
  COMMIT;
  exit
EOF
fi

2.job_pre_prc.sh

#!/bin/bash
#author zhangbingkai
#2018.10.14

#判断前驱是否成功执行完成
prc_call=$1
v_date=$2
shell_dir=$3
V_ORACLE_HOME=`cat $shell_dir/parameter.ini | grep ORACLE_HOME`
V_ORACLE_SID=`cat $shell_dir/parameter.ini | grep ORACLE_SID`
export ORACLE_HOME=${V_ORACLE_HOME:12}
export ORACLE_SID=${V_ORACLE_SID:11}
export PATH=$PATH:$ORACLE_HOME/bin
v_dblogin=`cat $shell_dir/parameter.ini | grep dblogin`
dblogin=${v_dblogin:8}
pre_job_id=`$ORACLE_HOME/bin/sqlplus -S $dblogin <<EOF
 set pagesize 0 feedback off verify off heading off echo off linesize 5000 
 select pre_job_id from job_prc_name where PRC_NAME = '$prc_call'; 
 exit
EOF`

  if [ "$pre_job_id" = 'ROOT' ]; then
    $shell_dir/run_prc.sh $prc_call $v_date $shell_dir
  else
    array=(${pre_job_id//,/ })
    for v_pre_job_id in ${array[@]}
    do
      status=`$ORACLE_HOME/bin/sqlplus -S $dblogin <<EOF
      set pagesize 0 feedback off verify off heading off echo off linesize 5000 
      select status from job_prc_name where job_id = '$v_pre_job_id'; 
      exit
EOF`
#判断前驱status
      sign='Y'
      if [ "$status" != 'SUC' ]; then
        sign='N'
        break
      fi
    done

    if [ "$sign" = 'Y' ]; then
      $shell_dir/run_prc.sh $prc_call $v_date $shell_dir
    fi
  fi

3.job_main_prc.sh

#!/bin/bash
#author zhangbingkai
#2018.10.16
v_date=$1
shell_dir=$2
V_ORACLE_HOME=`cat $shell_dir/parameter.ini | grep ORACLE_HOME`
V_ORACLE_SID=`cat $shell_dir/parameter.ini | grep ORACLE_SID`
export ORACLE_HOME=${V_ORACLE_HOME:12}
export ORACLE_SID=${V_ORACLE_SID:11}
export PATH=$PATH:$ORACLE_HOME/bin
v_dblogin=`cat $shell_dir/parameter.ini | grep dblogin`
dblogin=${v_dblogin:8}
total_ini_err=1
  $ORACLE_HOME/bin/sqlplus -S $dblogin <<EOF
  set pagesize 0 feedback off verify off heading off echo off linesize 5000 
  UPDATE JOB_PRC_NAME SET STATUS='INI',MESSAGE=NULL;
  COMMIT;
  exit
EOF
while [ "$total_ini_err" -gt 0 ]
do
  sleep 5s
  PRC_NAME=`$ORACLE_HOME/bin/sqlplus -S $dblogin <<EOF
  set pagesize 0 feedback off verify off heading off echo off linesize 5000 
  select prc_name from job_prc_name where status = 'INI'; 
  exit
EOF`
  for prc_call in $PRC_NAME
  do
    while [ true ]
    do
 #     sleep 1s
      v_count=`ps -ef | grep job_pre_prc |wc -l`
      if [ $v_count -lt 4 ]; then
        nohup $shell_dir/job_pre_prc.sh $prc_call $v_date $shell_dir &
        break
      else
        sleep 5s
      fi
    done
  done
  
  total_ini_err=`$ORACLE_HOME/bin/sqlplus -S $dblogin <<EOF
  set pagesize 0 feedback off verify off heading off echo off linesize 5000 
  select count(*) from job_prc_name where status <> 'SUC'; 
  exit
EOF`
done

4.parameter.ini

dblogin=test/password01@orcl
ORACLE_HOME=/home/oracle/app/oracle/product/12.2.0/dbhome_1
ORACLE_SID=orcl

5.readme

并行调度存储过程,需提前初始化job_prc_name表中的status(INI为初始化状态,RUN为正在执行状态,
SUC为执行成功的过程,ERR为执行失败的过程),message(初始化为NULL)字段。
修改parameter.ini配置信息,配置数据库的用户、密码、环境变量。
调用:nohup sh job_main_prc.sh 20180101 dir &

定时调用:必须写绝对路径
crontab -e
30 * * * * shell_dir=/home/oracle/run_shell_parallel; $shell_dir/job_main_prc.sh `date +\%Y\%m\%d` $shell_dir
***crontab command
分  时  日  月  周  命令
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令

猜你喜欢

转载自blog.csdn.net/weixin_43241054/article/details/90082216