0
0

【csh】キックシェルの作成(SQL編)

Posted at

前回の記事:【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編)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0