0.概要
bashのシェルスクリプトからSQL*Plusを起動してSQLを実行してます。
基本ではあるんだけど、やっぱり動いた実績のあるソースを
備忘として残しておきたいので記事化。
bash側で受け取った引数をそのままSQLに渡すとかもやってます。
1.コード本編
まずはbash側。
引数で日数を受け取って、チェック後SQLに渡してます。
また削除対象のテーブルを引数に応じて変更したりもしてます。
例によってちょくちょく出てくるファイル内で宣言していない変数は
全て共通環境変数から引っ張ってます。
DEL_TBL.sh
#!/bin/bash
# 機能名:テーブルデータ削除
#
# 引数(1):日数
# 引数(2):種類(1:ログテーブル 2:取込テーブル 3:データテーブル)
#共通環境変数読み込み
.COMMON.sh
SCRPT_NAME="DEL_TBL.sh"
${SCRPT_SHLOG} ${SCRPT_NAME} "I" "テーブルデータ削除開始 $1 $2"
#日数チェック
num=`expr "$1" : [0-9]`
if [[ ! $num -eq 1 ]]
then
${SCRPT_SHLOG} ${SCRPT_NAME} "E" "引数1が不正です"
${SCRPT_SHLOG} ${SCRPT_NAME} "E" "異常終了"
exit 9
fi
#削除対象テーブル決定
if [ $2 -eq 1 ]
then
SQL_FILE=$SCRPT_SHELL/LOGTBL_DEL.sql
elif [ $2 -eq 2 ]
then
SQL_FILE=$SCRPT_SHELL/TORIKOMITBL_DEL1.sql
elif [ $2 -eq 3 ]
then
SQL_FILE=$SCRPT_SHELL/DTTBL_DEL.sql
else
${SCRPT_SHLOG} ${SCRPT_NAME} "E" "引数2が不正です"
${SCRPT_SHLOG} ${SCRPT_NAME} "E" "異常終了"
exit 9
fi
#ora_connはuser/pass@host[:port]の構成
ora_conn=${ORA_CONN}
#sqlplus起動 ここからEOFまでsqlplus側のコード
sqlplus -s /nolog << EOF
conn $ora_conn
-- エラー時の戻り値設定
WHENEVER OSERROR EXIT 9
WHENEVER SQLERROR EXIT 9
SET SERVEROUTPUT ON SIZE UNLIMITED
-- 不必要な項目の表示抑制
SET NEWPAGE NONE
SET SPACE 0
SET TIME OFF
SET TIMING OFF
SET ECHO OFF
SET FEEDBACK OFF
SET HEADING OFF
SET PAGESIZE 0
SET VERIFY OFF
-- 問い合わせ結果非表示
SET TERMOUT OFF
-- SQL実行
@$SQL_FILE $1
exit COMMIT
EOF
#[正常終了ログ出力]
${SCRPT_SHLOG} ${SCRPT_ID} I ${MSG_N_END}
exit 0
SQLはそれぞれこんな感じ
&1で渡してるのが引数です。
LOGTBL_DEL.sql
DELETE
FROM LOG_TBL
WHERE
TO_CHAR(OUTPUTTIME , 'YYYYMMDD') < TO_CHAR(CURRENT_TIMESTAMP-&1, 'YYYYMMDD')
こちらは複数テーブルの削除をしたいので
SQLファイルの中から別のSQLファイルを呼んでいます。
その際引数もそのまま引き継いで渡してます。
TORIKOMITBL_DEL1.sql
DELETE
FROM TORIKOMI_TBL_H
WHERE DELFLG = '1'
AND TO_CHAR(INSDATE , 'YYYYMMDD') < TO_CHAR(CURRENT_TIMESTAMP - &1 , 'YYYYMMDD')
@TORIKOMITBL_DEL2.sql &1
呼ばれた先がこちら。
TORIKOMITBL_DEL2.sql
DELETE
FROM TORIKOMI_TBL_D
WHERE DELFLG = '1'
AND TO_CHAR(INSDATE , 'YYYYMMDD') < TO_CHAR(CURRENT_TIMESTAMP - &1 , 'YYYYMMDD')
最後の一つも同じような感じです。
DTTBL_DEL.sql
DELETE
FROM DT_TBL
WHERE DELFLG = '1'
AND TO_CHAR(INSDATE , 'YYYYMMDD') < TO_CHAR(CURRENT_TIMESTAMP - &1 , 'YYYYMMDD')