本程序批量调度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列要运行的命令