1. 程式人生 > >Linux/Unix shell 引數傳遞到SQL指令碼

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

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

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

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

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

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

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

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

4、測試指令碼

[python] view plaincopyprint?
  1. [email protected]:~/dba_scripts/custom/awr> ./tmp.sh  
  2. Usage:   
  3.       tmp.sh <ORACLE_SID> <begin_dat> <end_date>  
  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.    SNAP_ID       DBID SNAP_LEVEL  
  8. ---------- ---------- ----------  
  9.      138779385067151
  10. [email protected]:~/dba_scripts/custom/awr> ./tmp2.sh MMBOTST 20130307092013030710
  11.    SNAP_ID       DBID SNAP_LEVEL  
  12. ---------- ---------- ----------  
  13.      3626235092549841
  14. [email protected]:~/dba_scripts/custom/awr> ./tmp3.sh MMBOTST 20130307102013030711
  15. "variable value for begin_date is: 2013030710"
  16. "variable value for end_date id : 2013030711"
  17.    SNAP_ID       DBID SNAP_LEVEL  
  18. ---------- ---------- ----------  
  19.      3626335092549841

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定義的變數名相同

相關推薦

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

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

Linux/Unix shell 指令碼中呼叫SQL RMAN指令碼

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Linux Unix shell 編程指南學習筆記(第四部分)

fcm 驗證 () only arguments line div 反饋 sed 第十六章 shell腳本介紹 此章節內容較為簡單,跳過。 第十七章 條件測試 test命令 expr命令 test 格式 test condition 或者 [

關於 Shell 引數傳遞 與 預設值

簡介 除了基本的獲取指令碼執行時的傳入引數外, 還有更便捷的語法糖: 引數預設值, 自動賦值. 基本傳參 先來一個示例: #!/bin/sh echo 引數0: $0; echo 引數1: $1; echo 引數2: $2; echo 引數3: $3; echo 引數4: $4; 執行測試

Linux/Unix shell 監控Oracle例項(monitor instance)

    使用shell指令碼實現對Oracle資料庫的監控與管理將大大簡化DBA的工作負擔,如常見的對例項的監控,監聽的監控,告警日誌的監控,以及資料庫的備份,AWR report的自動郵件等。本文給出Linux 下使用 shell 指令碼來監控 Oracle 例項。1、監控

shell方式執行sql指令碼總是不成功的一則原因

shell指令碼: ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Linux Unix shell 程式設計指南學習筆記(第四部分)

第十六章  shell指令碼介紹 此章節內容較為簡單,跳過。 第十七章   條件測試 test命令 expr命令 test  格式  test  condition     或者  [ condition ]  (注意: condition兩側有空格) 檔案狀態測試:

Shell引數傳遞

在執行shell指令碼執行時,可以向指令碼傳遞引數,指令碼內用$1 $2 $3...來獲取引數,$1代表傳遞的第一個引數,以此類推。 指令碼如下 #!/bin/bash echo "執行的檔名

Shell指令碼通過引數傳遞呼叫指定函式

我們在寫一些功能性指令碼的時候,往往會把操作相似或者引數類似行為接近的函式放在同一個shell指令碼中,這樣管理方便,維護簡單,也很清晰。對於這種情況,通常的辦法是,在shell指令碼中定義所有用到的函式,然後在正文程式碼中用case語句讀入輸入的命令函式引數來呼叫指定的相

linux bash環境下面給expect指令碼傳遞引數

#!/usr/bin/expect # file name :rauth # Usages : rauth username [ passworld ] # Description : 自動傳送使用者名稱與密碼 # 執行 myxrgsu -a if { $argc !=

shell指令碼引數傳遞和main函式引數傳遞方式類似

shell指令碼 test.sh呼叫的時候傳入引數,param1,param2: #test.sh param1 param2 那麼在指令碼內部相當於把 test.sh param1 param2 看成三個引數出入,所以引數0為$0 (test.sh),引數1為$1 (pa

shell或者sql指令碼傳參或接收引數的方法

1.向shell中傳引數的方法,後面是重定向,將日誌匯出到當前目錄下sh a.sh aaa bbb > a.log2.shell中接收引數的方法echo "@a.sql $1"|sqlplus $1/$23.通過shell呼叫sql指令碼,並向其中傳引數的方法:echo

Linux系統——shell指令碼

      shell指令碼程式設計 作用:通過命令列解析的方式,自動執行設定好的程式或命令程式碼。(若將指令碼掛到定時任務中,就會自動在非工作時間裡自動觸發執行程式)   Shell指令碼檔案以“.sh”結尾 規範的Shell指令碼第一行會指出由哪個程式

Linux系統——shell指令碼應用示例

傳入一個網段地址,自動找出本網段記憶體活的IP地址。2,將存活的IP地址當作密碼來建立Linux使用者,使用者名稱格式為:你的名字_數字 3,有幾個存活IP地址,就自動建立幾個使用者   4,最後將建立的使用者名稱和密碼寫入到/tmp目錄下的某檔案裡 (1)找存活的ip (2)將ip去

鳥哥的 Linux私房菜讀書筆記--shell scripts(程式化指令碼

1、關於shell scripts shell scripts是利用 shell的功能寫的一個程式program,這個程式是使用純文字文,將一些shell的語法與指令(含外部指令)寫在裡面,搭配正則表示法、管線命令與資料流重導向等功能,以達到我們想要的處理目的。其中shell是指文字介面底下

Shell 實現Docker MySQL5.7安裝及SQL指令碼執行

Linux Shell 實現Docker MySQL安裝及指令碼執行的目標: 1、實現MySQL5.7安裝 2、安裝完成後建立對應的賬號和資料庫例項表等 建立docker mysql容器例項 定義docker_mysql_install.sh #! /bin/bash #fi

linuxshell指令碼除錯技術

在使用gcc編譯keepalived原始碼的時候,需要執行configure生成Makefile,然後用make命令編譯。但是在這個過程中,configure檔案卻一直無法掃描到一個已經安裝的三方庫。無奈,只能檢視configure原始碼。configure其實就是一個shell指令碼,為了

[一天幾個linux命令] shell指令碼之正則表示式

shell指令碼之正則表示式 原文連結:Linux–shell指令碼之正則表示式 概念及特點 概念 正則表示式是對字串操作的一種邏輯公式,就是用事先定義好的一些特定的字元、及這些特定字元的組合,組成一個"規則字串",這個"規則字串"用來表達對字串的一種過濾邏輯。規定一些特殊語

shell程式設計-引數傳遞

一、傳參介紹 (1)C語言中可以通過main函式的argc和argv給程式傳參 (2)shell程式本身也可以在呼叫時傳參給他。在shell程式內部使用傳參也是使用的一些特定符號來表示的,包括: $#表示呼叫該shell時傳參的個數。($#計數時只考慮真正的引數個數) $0、$1、$

jmeter 傳送加密請求 beanshell斷言 執行緒組間傳遞引數 jmeter bean shell斷言加密的響應資訊(加密介面測試二) jmeter 執行緒組之間的引數傳遞(加密介面測試三)

    原文地址https://www.cnblogs.com/wnfindbug/p/5817038.html 最近在做http加密介面,請求頭的uid引數及body的請求json引數都經過加密再發送請求,加密方式為:ase256。所以,jmeter傳送請求前也需要對uid及jso