0
0

【csh】個別シェルの作成

Posted at

前回の記事:【csh】キックシェルの作成

個別シェルの作成時に必要なスクリプトは、個別シェルと個別シェルのenvファイルになります。
あとは、必要に応じて、SQLファイルやctlファイルなど用途に応じて作成します。

1.envファイルの作成

まずは、envファイルから作成していきます。
以下の通り、etcディレクトリにtouchし、nanoエディタで編集する。
※フォルダ構成についてはUbuntuでcshを起動するための実行環境を整備する。を参照

ABC000.env
setenv SND_FILE_NM PRODUCTS_OUT.DAT

2.個別シェルの作成

次に、個別シェルを作成していきます。

make_products.csh
#!/usr/bin/csh -f
#***************************************************************
#
#システム名称:
#プログラム名:
#ファイル名称:
#処理概要:
#入力:
#出力:
#作成者:
#作成日:
#================================================================
#更新履歴
#----------------------------------------------------------------
#バージョン:
#修正日付:
#修正者:
#修正内容:
#***************************************************************
#----------------------------------------------------------------
# Prameters
#----------------------------------------------------------------
# Exit code
#    0 : 正常終了
#    1 : 日付取得エラー
#    2 : SQLエラー
#    3 : ファイル書き込みエラー
#----------------------------------------------------------------

#----------------------------------------------------------------
# 初期処理
#----------------------------------------------------------------

# リターンコード
set app_ret   = 0

# 実行時のスクリプト名
set name     = $0
set csh_name = ${name:t}
set job_name = ${csh_name:r}

#----------------------------------------------------------------
# ログファイルの変更
#----------------------------------------------------------------

# SQL実行時ログファイル
set log_file_sqltmp = ${BATCH_TMP}/${job_name}_sqltmp.log
echo ${log_file_sqltmp}

echo "----------------------------------------------------------------"
echo "=== ${job_name} Start Time : `date '+%Y-%m-%d %H:%M:%S'` ==="
echo "----------------------------------------------------------------"
echo ""

#----------------------------------------------------------------
# 基準日の取得&設定
#----------------------------------------------------------------
echo "【基準日の取得設定】処理 Start : : `date '+%Y-%m-%d %H:%M:%S'`"
echo ""

setenv KJUNYMD ${UNYOYMD}

#----------------------------------------------------------------
# アプリの実行(翌営業日の取得)
#----------------------------------------------------------------
set app_exec = ${APP_EXE}/Get_YokuYmd
if ( -x ${app_exec} ) then
    echo "Executing application ..."
    set YOKUYMD=`${app_exec}`
    set app_ret = ${status}
    echo "----------------------------------------------------------------"
    echo "`date '+%Y-%m-%d %H:%M:%S'` : INFO: 翌基準日 = ${YOKUYMD}"
    echo "----------------------------------------------------------------"
    echo "Done."
    echo ""
else
    echo "----------------------------------------------------------------"
    echo "`date '+%Y-%m-%d %H:%M:%S'` : ERR: 実行ファイルがありません( ${app_exec} )"
    echo "----------------------------------------------------------------"
    echo ""
    set app_ret = 1
    goto exit_point
endif

switch ( ${app_ret} )
    case 0:
        set app_ret = 0
        breaksw
    default:
        echo "----------------------------------------------------------------"
        echo "`date '+%Y-%m-%d %H:%M:%S'` : ERR: アプリが異常終了しました"
        echo "----------------------------------------------------------------"
        echo ""
        set app_ret = 1
        goto exit_point

endsw

#----------------------------------------------------------------
# 業務処理
#----------------------------------------------------------------
#----------------------------------------------------------------
# 商品レコードの登録
#----------------------------------------------------------------
echo "【商品レコードの登録】処理 Start : : `date '+%Y-%m-%d %H:%M:%S'`"
echo ""

echo "テーブルライフサイクル処理"
${SQLPLUS} -s ${DB_USER}/${DB_PW} << SQL_END >& ${log_file_sqltmp}

    set head off;

    whenever sqlerror eixt 5 rollbackl
    whenever oserror eixt 9 rollbackl
        spool ${log_file_sqltmp}
        DELETE
        FROM PRODUCTS
        WHERE UPDATED_AT = TO_CHAR(SYSDATE,'YYYYMMDD')
        ;
    spool off
    exit sql.sqlcode

SQL_END

#--SQL*Plasエラーチェック
if ( ${status} != 0 ) then
    echo "----------------------------------------------------------------"
    echo "`date '+%Y-%m-%d %H:%M:%S'` : ERR: PRODUCTSの削除SQL時にエラーが発生しました"
    echo "----------------------------------------------------------------"
    echo ""
    cat ${log_file_sqltmp}
    echo ""
    set app_ret = 2
    goto exit_point
endif

( grep '^ORA-' ${log_file_sqltmp} > /dev/null )
if ( ${status} == 0 ) then
    echo "----------------------------------------------------------------"
    echo "`date '+%Y-%m-%d %H:%M:%S'` : ERR: PRODUCTSの削除SQL時にエラーが発生しました"
    echo "----------------------------------------------------------------"
    echo ""
    cat ${log_file_sqltmp}
    echo ""
    set app_ret = 2
    goto exit_point
endif

#テーブルライフサイクル処理結果表示
echo ">>>>>>>>>>> SQL*PLUS MESSAGE START">>>>>>>>>>>"
echo ${log_file_sqltmp}
echo ">>>>>>>>>>> SQL*PLUS MESSAGE END">>>>>>>>>>>"
echo ""

echo "商品テーブル(PRODUCTS)をバックアップテーブル(PRODUCTS)に登録"
${SQLPLUS} -s ${DB_USER}/${DB_PW} << SQL_END >& ${log_file_sqltmp}

    set head off;

    whenever sqlerror SND_FILE_DIReixt 5 rollbackl
    whenever oserror eixt 9 rollbackl
        spool ${log_file_sqltmp}
        INSERT INTO PRODUCTS_BKP (
            PRODUCT_ID,
            PRODUCT_NAME,
            DESCRIPTION,
            PRICE,
            STOCK_QUANTITY,
            CATEGORY_ID,
            SUPPLIER_ID,
            SKU,
            WEIGHT,
            DIMENSIONS,
            IMAGE_URL,
            CREATED_AT,
            UPDATED_AT
        )
        SELECT
            PRODUCT_ID,
            PRODUCT_NAME,
            DESCRIPTION,
            PRICE,
            STOCK_QUANTITY,
            CATEGORY_ID,
            SUPPLIER_ID,
            SKU,
            WEIGHT,
            DIMENSIONS,
            IMAGE_URL,
            CREATED_AT,
            UPDATED_AT
        FROM PRODUCTS;
        ;
    spool off
    exit sql.sqlcode

SQL_END

#--SQL*Plasエラーチェック
if ( ${status} != 0 ) then
    echo "----------------------------------------------------------------"
    echo "`date '+%Y-%m-%d %H:%M:%S'` : ERR: PRODUCTS_BKPの登録SQL時にエラーが発生しました"
    echo "----------------------------------------------------------------"
    echo ""
    cat ${log_file_sqltmp}
    echo ""
    set app_ret = 2
    goto exit_point
endif

( grep '^ORA-' ${log_file_sqltmp} > /dev/null )
if ( ${status} == 0 ) then
    echo "----------------------------------------------------------------"
    echo "`date '+%Y-%m-%d %H:%M:%S'` : ERR: PRODUCTS_BKPの登録SQL時にエラーが発生しました"
    echo "----------------------------------------------------------------"
    echo ""
    cat ${log_file_sqltmp}
    echo ""
    set app_ret = 2
    goto exit_point
endif

#登録処理結果表示
echo ">>>>>>>>>>> SQL*PLUS MESSAGE START">>>>>>>>>>>"
echo ${log_file_sqltmp}
echo ">>>>>>>>>>> SQL*PLUS MESSAGE END">>>>>>>>>>>"
echo ""

#----------------------------------------------------------------
# ファイル作成
#----------------------------------------------------------------
echo "【商品ファイル作成】処理 Start : : `date '+%Y-%m-%d %H:%M:%S'`"
echo ""

echo "作成データ抽出"
${SQLPLUS} -s ${DB_USER}/${DB_PW} << SQL_END >& ${log_file_sqltmp}

    set pagesize 0;
    set LINESIZE 5000;
    set feedback off;
    set newpage none;
    set heading off;
    set TRIMSPOOL ON;
    whenever sqlerror eixt 5 rollbackl
    whenever oserror eixt 9 rollbackl
    spool ${log_file_sqltmp}

    SELECT
        PRODUCT_ID || ',' ||
        PRODUCT_NAME || ',' ||
        DESCRIPTION || ',' ||
        PRICE || ',' ||
        STOCK_QUANTITY || ',' ||
        CATEGORY_ID || ',' ||
        SUPPLIER_ID || ',' ||
        SKU || ',' ||
        WEIGHT || ',' ||
        DIMENSIONS || ',' ||
        IMAGE_URL || ',' ||
        TO_CHAR(CREATED_AT, 'YYYY-MM-DD HH24:MI:SS') || ',' ||
        TO_CHAR(UPDATED_AT, 'YYYY-MM-DD HH24:MI:SS')
    FROM PRODUCTS_BKP;

    spool off
    exit sql.sqlcode;
SQL_END

#--SQL*Plasエラーチェック
if ( ${status} != 0 ) then
    echo "----------------------------------------------------------------"
    echo "`date '+%Y-%m-%d %H:%M:%S'` : ERR: SQL実行時にエラーが発生しました"
    echo "----------------------------------------------------------------"
    echo ""
    cat ${log_file_sqltmp}
    echo ""
    set app_ret = 2
    goto exit_point
endif

( grep '^ORA-' ${log_file_sqltmp} > /dev/null )
if ( ${status} == 0 ) then
    echo "----------------------------------------------------------------"
    echo "`date '+%Y-%m-%d %H:%M:%S'` : ERR: SQL実行時にエラーが発生しました"
    echo "----------------------------------------------------------------"
    echo ""
    cat ${log_file_sqltmp}
    echo ""
    set app_ret = 2
    goto exit_point
endif

#データ部出力処理
set out_file = ${SND_FILE_DIR}/${SND_FILE_NM}
cat ${log_file_sqltmp} | sed '/^ *$/d' >& ${out_file} 
if ( ${status} != 0 ) then
    echo "----------------------------------------------------------------"
    echo "`date '+%Y-%m-%d %H:%M:%S'` : ERR: データ部ファイル書き込みエラー"
    echo "----------------------------------------------------------------"
    echo ""
    set app_ret = 3
    goto exit_point
endif

echo "----------------------------------------------------------------"
echo "`date '+%Y-%m-%d %H:%M:%S'` : INFO: データ部出力処理正常終了"
echo "----------------------------------------------------------------"
echo ""

#トレーラ部出力処理
echo "END(`date '+%Y-%m-%d %H:%M:%S'`)" >>& ${out_file} 
if ( ${status} != 0 ) then
    echo "----------------------------------------------------------------"
    echo "`date '+%Y-%m-%d %H:%M:%S'` : ERR: トレーラ部ファイル書き込みエラー"
    echo "----------------------------------------------------------------"
    echo ""
    set app_ret = 3
    goto exit_point
endif

echo "----------------------------------------------------------------"
echo "`date '+%Y-%m-%d %H:%M:%S'` : INFO: トレーラ部出力処理正常終了"
echo "----------------------------------------------------------------"
echo ""

#----------------------------------------------------------------
# 終了処理
#----------------------------------------------------------------
exit_point:

${RM} -f ${log_file_sqltmp} >& /dev/null

echo "----------------------------------------------------------------"
echo "=== ${job_name} End Time : `date '+%Y-%m-%d %H:%M:%S'` ==="
echo "----------------------------------------------------------------"
echo ""

echo "${job_name} JOB EXIT CODE = ${app_ret}"
echo "${job_name} End Time :`date '+%Y-%m-%d %H:%M:%S'`"

exit ${app_ret}


まとめ

今回は一般的なCshの作成を行ったが、次回はSQL*Lorderを駆使して、ファイルの取り込みを行う。キックシェルについてもLorder用のシェルが必要なので、新たに作成する。

次回記事:【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