天天看點

MySQL全面瓦解16:存儲過程相關

大多數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:表示存儲過程存在的情況下删除,我們上面示範的存儲過程都是判斷如果存在就先删除。

存儲過程不能修改,若涉及到修改的,可以先删除,然後重建。

可以檢視存儲過程詳細建立語句。

存儲過程的優點開篇已經說過了,這邊就不贅述了,個人使用的最大感觸是,盡量不要在應用代碼中寫大量的腳本邏輯,做成存儲過程或者函數會更高效簡潔且易于維護。

MySQL全面瓦解16:存儲過程相關

架構與思維·公衆号:撰稿者為bat、位元組的幾位高階研發/架構。不做廣告、不賣課、不要打賞,隻分享優質技術

碼字不易,歡迎關注,歡迎轉載

作者:翁智華

出處:https://www.cnblogs.com/wzh2010/

本文采用「CC BY 4.0」知識共享協定進行許可,轉載請注明作者及出處。

繼續閱讀