大多數SQL語句都是針對一個或多個表的單條語句。但并非所有業務都這麼簡單,經常會有複雜的操作需要多條語句才能完成。
比如使用者購買一個商品,要删減庫存表,要生成訂單資料,要儲存支付資訊等等,他是一個批量的語句執行行為。
存儲過程簡單來說,就是為以後的使用而儲存的一條或多條MySQL語句的集合。可将其視為批檔案,雖然它們的作用不僅限于批處理。
優點:
提高代碼的複用性:把一些通用操作内容封裝到一個存儲過程中,可以不斷的給業務功能複用。
簡化操作:避免在業務中寫大量的代碼
提高效率:減少執行次數和資料庫伺服器連接配接次數。
提高安全性:通過存儲過可以減少對基礎資料的誤操作,參數化的存儲過程一定程度上可以防止SQL注入式攻擊,而且可以将Grant、Deny以及Revoke權限應用于存儲過程。
說存儲過程之前,先來了解兩個重要的知識點:自定義變量 和 delimiter關鍵字。
變量由使用者自定義的,而非系統已經存在的。
第一步聲明;第二步指派;第三步使用(調用、比較和運算)
包含使用者變量和局部變量,我們一個個來看:
針對目前會話有效,作用域同會話變量。
使用者變量可以在任何地方使用,既可以是包含的begin和end,也可以是在這之外。
這邊需要注意:使用了@符号來定義 變量,set中=号前面冒号是可選的,select方式=前面必須有冒号。
一種方式就是跟聲明并初始化一緻,直接set、select進行指派,
另外一種就是直接從其他表、視圖或變量中查詢并指派,如下:
這邊需要注意兩種select的使用方式
declare用于定義局部變量,在存儲過程和函數中通過declare定義變量在begin…end中,且在語句之前。并且可以通過重複定義多個變量
declare變量的作用範圍同程式設計裡面類似,在這裡一般是在對應的begin和end之間。在end之後這個變量就沒有作用了,不能使用了。這個同程式設計一樣。
declare 變量名 變量類型,後面的 [ 預設值] 為可選;
注意自定義變量和局部變量的差別,一個前面有@符号,一個沒有。
檢視變量的值
變量類型
作用域
定義位置
文法格式
使用者變量
目前會話都有效
會話的任一地方
加<code>@</code>符号,無需指定類型
局部變量
所屬定義的begin end之間
begin...end中的第一個位置,緊跟在begin後面
不加<code>@</code>符号,需指定類型
delimiter是mysql分隔符,在mysql用戶端中分隔符預設是分号;。如果一次輸入的語句較多,并且語句中間有分号,這時需要新指定一個特殊的分隔符。
其實就是告訴mysql解釋器,該段指令是否已經結束了,mysql是否可以執行了。預設情況下,delimiter是分号;。在指令行用戶端中,如果有一行指令以分号結束,那麼回車後,mysql将會執行該指令。
詳細解釋:
其實就是告訴mysql解釋器,該段指令是否已經結束了,mysql是否可以執行了。
預設情況下,delimiter是分号;。在指令行用戶端中,如果有一行指令以分号結束, 那麼回車後,mysql将會執行該指令。如輸入下面的語句 :
然後回車,那麼MySQL将立即執行該語句。
但有時候,不希望MySQL這麼做。在為可能輸入較多的語句,且語句中包含有分号。 這種情況下,就需要事先把delimiter換成其它符号,如//、$$或者;;。
更改結束标志的定義如下:
舉個例子:建立一個存儲過程,在建立該存儲過程之前,将delimiter分隔符轉換成符号“//”,最後在轉換回符号“;”。
上面就是,先将分隔符設定為 //, 直到遇到下一個 //,才整體執行語句。
執行完後,最後一行, delimiter ; 将mysql的分隔符重新設定為分号;
如果不修改的話,本次會話中的所有分隔符都以// 為準。
存儲過程的操作包含建立
參數模式有3種:
in:該參數可以作為輸入,也就是該參數需要調用方傳入值。
out:該參數可以作為輸出,也就是說該參數可以作為傳回值。
inout:該參數既可以作為輸入也可以作為輸出,也就是說該參數需要在調用的時候傳入值,又可以作為傳回值。
參數模式預設為IN,一個存儲過程可以有多個輸入、多個輸出、多個輸入輸出參數。
是以建立存儲過程的時候參數可能存在一下幾種情況:
編寫存儲過程
調用實作:對比資料可确定調用成功
編寫存儲過程:
調用實作:
調用實作
自己試試吧,小夥子們
注意:調用存儲過程關鍵字是<code>call</code>。
如上所示 ,所有的call都是這樣的額
存儲過程隻能一個個删除,不能批量删除。
if exists:表示存儲過程存在的情況下删除,我們上面示範的存儲過程都是判斷如果存在就先删除。
存儲過程不能修改,若涉及到修改的,可以先删除,然後重建。
可以檢視存儲過程詳細建立語句。
存儲過程的優點開篇已經說過了,這邊就不贅述了,個人使用的最大感觸是,盡量不要在應用代碼中寫大量的腳本邏輯,做成存儲過程或者函數會更高效簡潔且易于維護。

架構與思維·公衆号:撰稿者為bat、位元組的幾位高階研發/架構。不做廣告、不賣課、不要打賞,隻分享優質技術
碼字不易,歡迎關注,歡迎轉載
作者:翁智華
出處:https://www.cnblogs.com/wzh2010/
本文采用「CC BY 4.0」知識共享協定進行許可,轉載請注明作者及出處。