前回の記事:【csh】キックシェルの概要
キックシェルの作成時に必要なスクリプトは、キックシェルとキックシェルのenvファイルになります。
1.envファイルの作成
envファイルは前回記事と同様のbatch_envset.cshを使用する
記事:【csh】キックシェルの作成
2.キックシェルの作成
キックシェルでやりたいことは、以下の通り
・「1.」で作成したenvファイルを読み込み
・初期処理(変数の準備やログの出力先を指定)
・ログファイルの設定
・起動シェルの環境設定
・日付の取得
・SQLファイル取得
・ヘッダ・トレーラチェック
・SQLファイルの実行
・SQL*Loaderの実行
・受信ファイル移動
・実行結果を統合監視(JP1)に出力
※前回のキックシェルとの違いは太字で表現
実際の処理は以下の通り。
app_batch_loader.csh
#!/bin/csh -f
#---------------------------------------------------------------------------------------------------
#
#システム名称 :
#プログラムID :
#プログラム名 :
#処理概要 :
#
#入力 :
#出力 :
#バーション :
#作成者 :
#作成日 :
#===================================================================================================
#更新履歴
#---------------------------------------------------------------------------------------------------
#バージョン :
#修正日付 :
#修正者 :
#修正内容 :
#--------------------------------------------------------------------------------------------------
# Parameters
# P1 : JOB Name
# P2 : Ctl File Name
#---------------------------------------------------------------------------------------------------
# Exit code
# 0 : Normal End
# 4 : log file open error
# 5 : env file not found or not read
# 6 : parameter miss
# 99 : Abnormal End
#---------------------------------------------------------------------------------------------------
###--- Set Enviroment
source /home/yuya/csh_project/batch/etc/batch_envset.csh
set system_date = `date +'%y%m%d'`
set my_procid = $$
setenv MVFLG OFF
setenv HEADERCHK OFF
setenv TRAILERCHK OFF
setenv SQL_FILE_DIR ""
setenv SQL_FILE_NM ""
set this_shell_tmp = $0
set this_shell = ${this_shell_tmp:t}
set job_name = ${this_shell:r}
set ret_code = 0
set shell_log = ${BATCH_TMP}/${this_shell:r}_${my_procid}.log
set log_file = ${shell_log}
set log_file_fix = ${BATCH_LOG}/${this_shell:r}_${my_procid}.log
echo "INFO:${job_name}: Shell Check Start Time = `date +'%Y-%m-%d %H:%M:%S'`" >& ${shell_log}
#Check Argument Numbers
switch ( $#argv )
case 2:
echo "Shell = $0" >>& ${shell_log}
echo "pram1 = $1" >>& ${shell_log}
echo "pram1 = $2" >>& ${shell_log}
breaksw
default:
echo "ERR:${job_name} 引数は2つ" >>& ${shell_log}
set ret_code = 6
goto exit_point
endsw
set job_name = ${argv[1]}
set CTL_FILE_NM = ${argv[2]}
###
# Job log file の設定 & Shell log の移動
#
set log_file = ${BATCH_TMP}/${job_name}_${my_procid}.log
set log_file_fix = ${BATCH_LOG}/${job_name}_${my_procid}.log
echo "INFO:${this_shell:r}: Job log file = ${log_file}" >>& ${shell_log}
echo "INFO:${this_shell:r}: Shell Check End Time = `date +'%Y-%m-%d %H:%M:%S'`" >>& ${shell_log}
echo "" >>& ${log_file}
echo "*** ${job_name}: JOB Start Time = `date +'%Y-%m-%d %H:%M:%S'`" >>& ${log_file}
echo "" >>& ${log_file}
cat ${shell_log} >>& ${log_file}
if ( ${status} == 0 ) then
\rm -f ${log_file} >& /dev/null
else
echo "ERR:${job_name} ログファイルがオープンできません( ${log_file} )" >>& ${shell_log}
set ret_code = 4
goto exit_point
endif
set OUID = ${DB_USER}/${DB_PW}
set PARA = ${BEANS_BATCH}/ctl/ldr_common.par
set db_log = ${BATCH_TMP}/${job_name:r}_db_${my_prcid}.log
set sql_file = ${BATCH_TMP}/${job_name:r}_db_${my_prcid}_delete.log
###
# 個別JOB環境の設定
#
set app_env_file = ${BEANS_BATCH}/etc/${job_name}.env
if ( ! -r ${app_env_file} ) then
echo "ERR:${job_name} app.envファイル( ${app_env_file} )が存在しません" >>& ${log_file}
set ret_code = 5
goto exit_point
endif
source ${app_env_file}
###
# Batch日付の取得
#
set batch_date = `${BEANS_BATCH}/bin/GetBatchDate`
if ( ${status} != 0 ) then
echo "ERR: Batch日付の取得に失敗しました" >>& ${log_file}
set ret_code = 99
goto exit_point
endif
setenv UNYOYMD ${batch_date}
echo "INFO: バッチ日付 = ${UNYOYMD}" >>& ${log_file}
###
# SQLファイルパス・ファイル名取得
#
set exec_sql = ${SQL_FILE_DIR}/${SQL_FILE_NM}
#----------------------------------------------------------------
# ヘッダーファイルチェック
#----------------------------------------------------------------
if ( ${HEADERCHK} == 'ON' ) then
set HeaderRecord = `grep "HEADER" ${RCV_FILE_DIR}/${DAT_file_NM}`
if ( ${status} != 0) then
echo "ERR: データファイルにヘッダーレコードが存在しません" >>& ${log_file}
set ret_code = 99
goto exit_point
endif
set FileYMD = `echo ${HeaderRecord} | cut -c 9-16`
echo "INF: HEADER = ${FileYMD}" >>& ${log_file}
if ( ${UNYOYMD} != ${FileYMD} ) then
echo "ERR: ヘッダー日付が不正です。ヘッダー日付 = ${FileYMD}" >>& ${log_file}
set ret_code = 99
goto exit_point
endif
endif
#----------------------------------------------------------------
# トレーラファイルチェック
#----------------------------------------------------------------
if ( ${TRAILERCHK} == 'ON' ) then
set Trailer = `grep "TRAILER" ${RCV_FILE_DIR}/${DAT_file_NM}`
if ( ${status} != 0) then
echo "ERR: データファイルにトレーラレコードが存在しません" >>& ${log_file}
set ret_code = 99
goto exit_point
endif
@ FileLine = `echo ${Trailer} | cut -c 9-23`
@ Line = `cut ${RCV_FILE_DIR}/${DAT_file_NM} | grep -v "HEADER" | grep -v "TRAILER" | wc -l`
if ( ${FileLine} != ${Line} ) then
echo "ERR: トレーラ件数が不正です。トレーラ件数 = ${FileLine} データ件数 = ${Line}" >>& ${log_file}
set ret_code = 99
goto exit_point
endif
endif
#----------------------------------------------------------------
# SQL環境変数チェック
#----------------------------------------------------------------
if ( ${SQL_FILE_DIR} == "" ) then
echo "========= SQL skep1 =========" >>& ${log_file}
else if ( ${SQL_FILE_NM} == "" ) then
echo "========= SQL skep2 =========" >>& ${log_file}
else
echo "========= SQL start =========" >>& ${log_file}
echo "" >>& ${log_file}
: >! ${sql_file}
${SQLPLUS} -s ${DB_USER}/${DB_PW} < ${exec_sql} >& ${sql_file}
#----------------------------------------------------------------
# DBエラー処理
#----------------------------------------------------------------
set rc = ${status}
#--- SQL*Plus エラーチェック
if ( ${rc} != 0 ) then
echo "`date +'%Y-%m-%d %H:%M:%S'` : ERR : ${this_shell_tmp} : SQL*PLUS error." >>& ${log_file}
echo "" >>& ${log_file}
echo "----------------------------------------------------------------" >>& ${log_file}
cat ${sql_file} >>& ${log_file}
echo "----------------------------------------------------------------" >>& ${log_file}
echo ""
set ret_code = 99
goto exit_point
endif
( grep '`ORA-' ${sql_file} > /dev/nuill ) >>& ${log_file}
if ( ${status} == 0 ) then
echo "`date +'%Y-%m-%d %H:%M:%S'` : ERR : ${this_shell_tmp} : ORACLE error." >>& ${log_file}
echo "" >>& ${log_file}
echo "----------------------------------------------------------------" >>& ${log_file}
${CAT} ${sql_file} >>& ${log_file}
echo "----------------------------------------------------------------" >>& ${log_file}
echo "" >>& ${log_file}
set ret_code = 99
goto exit_point
else
echo "----------------------------------------------------------------" >>& ${log_file}
cat ${sql_file} >>& ${log_file}
echo "----------------------------------------------------------------" >>& ${log_file}
echo "" >>& ${log_file}
endif
echo "========= SQL end =========" >>& ${log_file}
echo "" >>& ${log_file}
echo ">>>>>>>>>> SQL*PLUS MSG START >>>>>>>>" >>& ${log_file}
${CAT} ${sql_file} >>& ${log_file}
${RM} -f ${sql_file} >& /dev/null
echo ">>>>>>>>>> SQL*PLUS MSG END >>>>>>>>" >>& ${log_file}
endif
#----------------------------------------------------------------
# SQL*Loaderの実行
#----------------------------------------------------------------
echo "${SQLLDR} userid=${OUID} parfile=${PARA} CONTROL=${BEANS_BATCH}/ctl/${CTL_FILE_NM} DATA=${RCV_FILE_DIR}/${DAT_FILE_NM} LOG=${db_log}" >>& ${log_file}
: >! ${db_log}
${SQLLDR} userid=${OUID} parfile=${PARA} CONTROL=${BEANS_BATCH}/ctl/${CTL_FILE_NM} DATA=${RCV_FILE_DIR}/${DAT_FILE_NM} LOG=${db_log} >& ${db_log}
set ret_code = ${status}
if ( ${ret_code} >= 3 ) then
echo "ERR:${job_name}: バッチ処理(load)が異常終了しました" >>& ${log_file}
goto exit_point
endif
grep 'ORA-' ${db_log} > /dev/null
if ( ${status} == 0 ) then
echo "ERR:${job_name}: バッチ処理(DB)が異常終了しました" >>&
echo ">>>>>>>>>> DB_LOG MSG START >>>>>>>>" >>& ${log_file}
${CAT} ${db_log} >>& ${log_file}
${RM} -f ${db_log} >& /dev/null
echo ">>>>>>>>>> DB_LOG MSG END >>>>>>>>" >>& ${log_file}
set ret_code = 99
goto exit_point
endif
echo ">>>>>>>>>> LOADER MSG START >>>>>>>>" >>& ${log_file}
${CAT} ${db_log} >>& ${log_file}
${RM} -f ${db_log} >& /dev/null
echo ">>>>>>>>>> LOADER MSG END >>>>>>>>" >>& ${log_file}
#----------------------------------------------------------------
# 受信ファイルの移動
#----------------------------------------------------------------
if ( ${MVFLG} == 'ON' ) then
echo "INFO: 受信ファイルを移動します。${DAT_FILE_NM}_bkp にリネームします。" >>& ${log_file}
${MV} -f ${RCV_FILE_DIR}/${DAT_FILE_NM} ${RCV_FILE_DIR}/${DAT_FILE_NM}_bkp
if ( ${status} != 0 ) then
echo "WARN: 受信ファイルの移動に失敗しました。ロード処理までは正常終了しています。" >>& ${log_file}
echo "WARN: 受信ファイルの移動を行ってください。" >>& ${log_file}
set ret_code = 99
goto exit_point
endif
endif
###
# Job End
#
exit_point:
###
# 統合監視メッセージ
#
switch ( ${ret_code} )
case 0:
set unyo_msg_code = "ABC0000I"
set unyo_msg = "${job_name} Normal End"
breaksw
default:
set unyo_msg_code = "ABC0001E"
set unyo_msg = "${job_name} Abnormal End COND = ${ret_code}"
breaksw
endsw
#-統合監視へ出力
if ( ${ret_code} != 0 ) then
logger -p local0.notice "${unyo_msg_code} ${unyo_msg}"
endif
echo "UNYO_MSG = ${unyo_msg_code} ${unyo_msg}" >>& ${log_file}
echo "JOB_EXIT_CODE = ${ret_code}" >>& ${log_file}
echo "*** ${job_name}: JOB End Time = `date +'%Y-%m-%d %H:%M:%S'`" >>& ${log_file}
${MV} -f ${log_file} ${log_file_fix}
exit ${ret_code}
まとめ
SQLの処理は主にライフサイクル処理を記載する。これにより、一意エラーを防ぐ狙いがある。
次回は個別シェル(SQL編)を作成してキックシェルで起動してみる。
次回記事:【csh】個別シェルの作成(SQL編)