shell調用存儲過程


shell腳本,調用存儲過程:
   mysql -h *** -u *** -D *** -p*** -e ***

   -h ip地址
   -u 數據庫用戶
   -D 數據庫
   -p密碼
   -e 調用存儲過程的語句 call haha()
   
   -p和密碼之間沒有空格,請注意!

   shell腳本范例:
    #ip地址
    HOST="xxx"
    #端口號
    PORT="xxx"
    #用戶名
    USER="xxx"
    #密碼
    PASSWORD="xxx"
    #數據庫名
    DATABASE="xxx"
    #路徑,日志所在路徑,
    DIR="xxx"
    #日志
    log="log.txt"
    #存儲過程
    CALL="call m_user_day()"
    #當前時間
    cur_dateTime="`date +%Y-%m-%d,%H:%m:%s`"


    MAILTO=""
    cd ${DIR}

    #輸入到日志
    SQL="exec mysql -h${HOST} -u${USER} -p${PASSWORD} -D ${DATABASE} --default-character-set=utf8 -e \"${CALL}\""

 

#

$()是將括號內命令的執行結果賦值給變量

${}和$變量名沒有什么區別,但使用括號語義更明確


    echo ${SQL} >> ${log} 2>&1
    echo ${cur_dateTime} >> ${log} 2>&1

    if   mysql -h ${HOST} \
           -u ${USER} \
           -p${PASSWORD} \
           -D ${DATABASE} \
           --default-character-set=utf8 \
           -e "${CALL}"; then
          echo "ok"  >> ${log} 2>&1
    else
          echo "error" >> ${log} 2>&1
    fi

    exit
    shell編寫后,肯定要先測試一下shell腳本是否可以:

    一.MAILTO="",禁止發送郵件,定時器執行shell腳本時,會以發送郵件的形式表現,使shell腳本的echo無作用
      所以必須禁止發送郵件,
    二.如果在shell腳本中需要進行輸出的話,echo並不會起作用,只能將語句輸出到一個日志文件中,
      需要 >> 重定向到一個文件中,並在后面加上2>&1 如echo "ok"  >> ${log} 2>&1
      需要 MAILTO=""  >>  2>&1 三者配合才可以將日志輸出到文件中
    三.如果腳本語句沒有問題的話,進行執行腳本,腳本執行時,如果超過10秒,那你對數據庫的操作就是失敗的了,
    最有可能報的一個錯誤就是 連接不到數據庫,這是一個很籠統的錯誤,錯誤原因很多
       1.網絡原因,
          ping www.baidu.com  沒有問題
      ping 數據庫所在的服務器ip 不通,就是網絡的問題了,
      我就是這樣的問題,(雲服務器上執行腳本,操作公司內網服務器上的數據庫),執行腳本時,一直提示mysql連接失敗
      所以,先ping ip,看看是否可以連通,如果不可以,就要注意一下了
    2.ping ip可以的話,在執行shell腳本,還是提示mysql連接失敗,就有可能是mysql的問題了
       有可能是mysql沒有開啟遠程調用權限
       解決辦法:1.關閉mysql,在my.ini文件的最后一行加上一句話  skip-grant-tables 開啟mysql
                  2.更新user表的Host為% update user authentication_String
              UPDATE user SET authentication_String=PASSWORD(’newpassword’) where USER=’root’;

              注意,mysql的password列有可能變為了authentication_String

              FLUSH PRIVILEGES重啟misql

              登陸mysql

 

1、在 bash shell 中,$()是將括號內命令的執行結果賦值給變量:
(base) zeng@zeng-X11DAi-N:~/workspace$ ls a.sh data.sh results.txt #將命令 ls 賦值給變量 a (base) zeng@zeng-X11DAi-N:~/workspace$ a=$(ls) (base) zeng@zeng-X11DAi-N:~/workspace$ echo $a a.sh data.sh results.txt 
2、${} 是用來作變量替換。一般情況下,$var 與 ${var} 並沒有啥不一樣。但是用 ${ } 會比較精確的界定變量名稱的范圍:
(base) zeng@zeng-X11DAi-N:~/workspace$ A=B
#目的想打印變量A,然后再加上一個B,結果返回無。
(base) zeng@zeng-X11DAi-N:~/workspace$ echo $AB
#此時,${ }可以較為精確的確定變量的范圍
(base) zeng@zeng-X11DAi-N:~/workspace$ echo ${A}B
BB
(base) zeng@zeng-X11DAi-N:~/workspace$
3、${ } 的一些特殊功能:

假設我們定義了一個變量為:file=/dir1/dir2/dir3/my.file.txt

${file#*/}:拿掉第一條 / 及其左邊的字符串:dir1/dir2/dir3/my.file.txt ${file##*/}:拿掉最后一條 / 及其左邊的字符串:my.file.txt ${file#*.}:拿掉第一個 . 及其左邊的字符串:file.txt ${file##*.}:拿掉最后一個 . 及其左邊的字符串:txt ${file%/*}:拿掉最后條 / 及其右邊的字符串:/dir1/dir2/dir3 ${file%%/*}:拿掉第一條 / 及其右邊的字符串:(空值) ${file%.*}:拿掉最后一個 . 及其右邊的字符串:/dir1/dir2/dir3/my.file ${file%%.*}:拿掉第一個 . 及其右邊的字符串:/dir1/dir2/dir3/my 記憶的方法為: # 是去掉左邊(在鑒盤上 # 在 $ 之左邊) % 是去掉右邊(在鑒盤上 % 在 $ 之右邊) 單一符號是最小匹配﹔兩個符號是最大匹配。 ${file#/}(不加*號)表示只去掉最左邊的/ 
 
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM