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