LoginSignup
9
8

More than 5 years have passed since last update.

bashからSQL*Plusを起動してSQLを実行する

Posted at

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')

9
8
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
9
8