在資料庫營運的過程中,Shell 指令碼在很大程度上為營運提供了極大的便利性。而shell 指令碼參數作為變數傳遞給SQL以及SQL指令碼也是DBA經常碰到的情形之一。本文主要討論了如何將shell指令碼的參數傳遞到SQL指令碼之中並執行SQL查詢。
有關shell與SQL之間的變數傳遞,請參考: Linux/Unix shell sql 之間傳遞變數
1、啟動sqlplus時執行指令碼並傳遞參數
robin@SZDB:~/dba_scripts/custom/awr> more tmp.sh
#!/bin/bash
# ----------------------------------------------
# Set environment here
# Author : Robinson Cheng
# Blog : http://blog.csdn.net/robinson-0612
# ----------------------------------------------
if [ -f ~/.bash_profile ]; then
. ~/.bash_profile
fi
if [ -z "${1}" ] || [ -z "${2}" ] || [ -z "${3}" ] ;then
echo "Usage: "
echo " `basename $0` <Oracle_SID> <begin_dat> <end_date>"
read -p "please input begin ORACLE_SID:" ORACLE_SID
read -p "please input begin date and time(e.g. yyyymmddhh24):" begin_date
read -p "please input end date and time(e.g. yyyymmddhh24):" end_date
else
ORACLE_SID=${1}
begin_date=${2}
end_date=${3}
fi
export ORACLE_SID begin_date end_date
#Method 1: pass the parameter to script directly after script name
sqlplus -S gx_adm/gx_adm @/users/robin/dba_scripts/custom/awr/tmp.sql $begin_date $end_date
exit
robin@SZDB:~/dba_scripts/custom/awr> more tmp.sql
SELECT snap_id, dbid, snap_level
FROM dba_hist_snapshot
WHERE TO_CHAR (begin_interval_time, 'yyyymmddhh24') = '&1'
AND TO_CHAR (end_interval_time, 'yyyymmddhh24') = '&2';
exit;