Linux/Unix shell 引數傳遞到SQL指令碼

us_yunleiwang發表於2013-12-05

在資料庫運維的過程中,Shell 指令碼在很大程度上為運維提供了極大的便利性。而shell 指令碼引數作為變數傳遞給SQL以及SQL指令碼也是DBA經常碰到的情形之一。本文主要討論瞭如何將shell指令碼的引數傳遞到SQL指令碼之中並執行SQL查詢。
  有關shell與SQL之間的變數傳遞,請參考:  Linux/Unix shell sql 之間傳遞變數

1、啟動sqlplus時執行指令碼並傳遞引數

  1. robin@SZDB:~/dba_scripts/custom/awr> more tmp.sh  
  2. #!/bin/bash  
  3.   
  4. # ----------------------------------------------  
  5. #  Set environment here  
  6. #  Author : Robinson Cheng  
  7. #  Blog   : http://blog.csdn.net/robinson_0612  
  8. # ----------------------------------------------  
  9.   
  10. if [ -f ~/.bash_profile ]; then  
  11.     . ~/.bash_profile  
  12. fi  
  13.   
  14. if [ -z "${1}" ] || [ -z "${2}" ] || [ -z "${3}" ] ;then  
  15.     echo "Usage: "  
  16.     echo "      `basename $0`   "  
  17.     read -p "please input begin ORACLE_SID:" ORACLE_SID  
  18.     read -p "please input begin date and time(e.g. yyyymmddhh24):" begin_date  
  19.     read -p "please input end date and time(e.g. yyyymmddhh24):" end_date  
  20. else  
  21.     ORACLE_SID=${1}  
  22.     begin_date=${2}  
  23.     end_date=${3}  
  24. fi  
  25.   
  26. export ORACLE_SID begin_date end_date  
  27.   
  28. #Method 1: pass the parameter to script directly after script name  
  29. sqlplus -S gx_adm/gx_adm @/users/robin/dba_scripts/custom/awr/tmp.sql $begin_date $end_date   
  30.   
  31. exit  
  32.   
  33. robin@SZDB:~/dba_scripts/custom/awr> more tmp.sql  
  34. SELECT snap_id, dbid, snap_level  
  35.   FROM dba_hist_snapshot  
  36.  WHERE TO_CHAR (begin_interval_time, 'yyyymmddhh24') = '&1'  
  37.        AND TO_CHAR (end_interval_time, 'yyyymmddhh24') = '&2';  
  38. exit;  

2、在SQL提示符下傳遞引數

  1. robin@SZDB:~/dba_scripts/custom/awr> more tmp2.sh  
  2. #!/bin/bash  
  3.   
  4. # ----------------------------------------------  
  5. #  Set environment here  
  6. #  Author : Robinson Cheng  
  7. #  Blog   : http://blog.csdn.net/robinson_0612  
  8. # ----------------------------------------------  
  9.   
  10. if [ -f ~/.bash_profile ]; then  
  11.     . ~/.bash_profile  
  12. fi  
  13.   
  14. if [ -z "${1}" ] || [ -z "${2}" ] || [ -z "${3}" ] ;then  
  15.     echo "Usage: "  
  16.     echo "      `basename $0`   "  
  17.     read -p "please input begin ORACLE_SID:" ORACLE_SID  
  18.     read -p "please input begin date and time(e.g. yyyymmddhh24):" begin_date  
  19.     read -p "please input end date and time(e.g. yyyymmddhh24):" end_date  
  20. else  
  21.     ORACLE_SID=${1}  
  22.     begin_date=${2}  
  23.     end_date=${3}  
  24. fi  
  25.   
  26. export ORACLE_SID begin_date end_date  
  27.   
  28. #Method 2: pass the parameter in SQL prompt. Using the same method with method 1  
  29. sqlplus -S " / as sysdba" <
  30. @/users/robin/dba_scripts/custom/awr/tmp.sql $begin_date $end_date  
  31. exit;  
  32. EOF  
  33. exit  

3、透過定義變數的方式來傳遞引數

  1. robin@SZDB:~/dba_scripts/custom/awr> more tmp3.sh   
  2. #!/bin/bash  
  3.   
  4. # ----------------------------------------------  
  5. #  Set environment here  
  6. #  Author : Robinson Cheng  
  7. #  Blog   : http://blog.csdn.net/robinson_0612  
  8. # ----------------------------------------------  
  9.   
  10. if [ -f ~/.bash_profile ]; then  
  11.     . ~/.bash_profile  
  12. fi  
  13.   
  14. if [ -z "${1}" ] || [ -z "${2}" ] || [ -z "${3}" ] ;then  
  15.     echo "Usage: "  
  16.     echo "      `basename $0`   "  
  17.     read -p "please input begin ORACLE_SID:" ORACLE_SID  
  18.     read -p "please input begin date and time(e.g. yyyymmddhh24):" begin_date  
  19.     read -p "please input end date and time(e.g. yyyymmddhh24):" end_date  
  20. else  
  21.     ORACLE_SID=${1}  
  22.     begin_date=${2}  
  23.     end_date=${3}  
  24. fi  
  25.   
  26. export ORACLE_SID begin_date end_date  
  27.   
  28. #Method 3: pass the parameter to global variable firstly.  
  29. sqlplus -S " / as sysdba" <
  30. define begin_date=$begin_date          
  31. define end_date=$end_date  
  32. prompt "variable value for begin_date is: &begin_date"  
  33. prompt "variable value for end_date id : &end_date"  
  34. @/users/robin/dba_scripts/custom/awr/tmp3.sql begin_date end_date  
  35. exit;  
  36. EOF  
  37. exit  
  38.   
  39. robin@SZDB:~/dba_scripts/custom/awr> more tmp3.sql  
  40. SELECT snap_id, dbid, snap_level  
  41.   FROM dba_hist_snapshot  
  42.  WHERE TO_CHAR (begin_interval_time, 'yyyymmddhh24') = '&begin_date'  
  43.        AND TO_CHAR (end_interval_time, 'yyyymmddhh24') = '&end_date';  
  44. exit;  

4、測試指令碼

  1. robin@SZDB:~/dba_scripts/custom/awr> ./tmp.sh  
  2. Usage:   
  3.       tmp.sh     
  4. please input begin ORACLE_SID:CNMMBO  
  5. please input begin date and time(e.g. yyyymmddhh24):2013030709  
  6. please input end date and time(e.g. yyyymmddhh24):2013030710  
  7.   
  8.    SNAP_ID       DBID SNAP_LEVEL  
  9. ---------- ---------- ----------  
  10.      13877  938506715          1  
  11.   
  12. robin@SZDB:~/dba_scripts/custom/awr> ./tmp2.sh MMBOTST 2013030709 2013030710  
  13.   
  14.    SNAP_ID       DBID SNAP_LEVEL  
  15. ---------- ---------- ----------  
  16.      36262 3509254984          1  
  17.   
  18. robin@SZDB:~/dba_scripts/custom/awr> ./tmp3.sh MMBOTST 2013030710 2013030711  
  19. "variable value for begin_date is: 2013030710"  
  20. "variable value for end_date id : 2013030711"  
  21.   
  22.    SNAP_ID       DBID SNAP_LEVEL  
  23. ---------- ---------- ----------  
  24.      36263 3509254984          1  

5、小結
a、本文主要描述了將shell的引數傳遞給SQL指令碼
b、方式1的用法是直接將shell變數跟在指令碼之後, sqlplus userid/pwd @script_name $para1 $para2
c、方式2是啟動sqlplus後在SQL提示符下來傳遞引數, SQL>@script_name $para1 $para2
d、方式3則是將shell變數的值先傳遞給define定義的變數,然後再傳遞給SQL指令碼 SQL>@script_name var1 var2
e、注意方式3中SQL指令碼的替代變數與define定義的變數名相同

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23490154/viewspace-1062427/,如需轉載,請註明出處,否則將追究法律責任。

相關文章