mysql_存儲過程與存儲函數(shù)

一.存儲過程概述
1.理解
含義:存儲過程的英文是 Stored Procedure 。它的思想很簡單,就是一組經(jīng)過 預(yù)先編譯 的 SQL 語句 的封裝。?
好處:
1、簡化操作,提高了sql語句的重用性,減少了開發(fā)程序員的壓力?
2、減少操作過程中的失誤,提高效率?
3、減少網(wǎng)絡(luò)傳輸量(客戶端不需要把所有的 SQL 語句通過網(wǎng)絡(luò)發(fā)給服務(wù)器)?
4、減少了 SQL 語句暴露在 網(wǎng)上的風(fēng)險,也提高了數(shù)據(jù)查詢的安全性
和視圖、函數(shù)的對比:
它和視圖有著同樣的優(yōu)點(diǎn),清晰、安全,還可以減少網(wǎng)絡(luò)傳輸量。不過它和視圖不同,視圖是 虛擬表 , 通常不對底層數(shù)據(jù)表直接操作,而存儲過程是程序化的 SQL,可以 直接操作底層數(shù)據(jù)表 ,相比于面向集 合的操作方式,能夠?qū)崿F(xiàn)一些更復(fù)雜的數(shù)據(jù)處理。
一旦存儲過程被創(chuàng)建出來,使用它就像使用函數(shù)一樣簡單,我們直接通過調(diào)用存儲過程名即可。相較于 函數(shù),存儲過程是 沒有返回值 的。

2.分類
存儲過程的參數(shù)類型可以是IN、OUT和INOUT。
1、沒有參數(shù)(無參數(shù)無返回)?
2、僅僅帶 IN 類型(有參數(shù)無返回)?
3、僅僅帶 OUT 類型(無參數(shù)有返 回)?
4、既帶 IN 又帶 OUT(有參數(shù)有返回)?
5、帶 INOUT(有參數(shù)有返回)
注意:IN、OUT、INOUT 都可以在一個存儲過程中帶多個。

二. 創(chuàng)建存儲過程
語法:
1、參數(shù)前面的符號的意思?
IN :當(dāng)前參數(shù)為輸入?yún)?shù),也就是表示入?yún)ⅲ?存儲過程只是讀取這個參數(shù)的值。如果沒有定義參數(shù)種類, 默認(rèn)就是 IN ,表示輸入?yún)?shù)。
OUT :當(dāng)前參數(shù)為輸出參數(shù),也就是表示出參; 執(zhí)行完成之后,調(diào)用這個存儲過程的客戶端或者應(yīng)用程序就可以讀取這個參數(shù)返回的值了。
INOUT :當(dāng)前參數(shù)既可以為輸入?yún)?shù),也可以為輸出參數(shù)。
2、形參類型可以是 MySQL數(shù)據(jù)庫中的任意類型。

三. 調(diào)用存儲過程
1.調(diào)用格式
2.舉例:創(chuàng)建存儲過程,實(shí)現(xiàn)累加運(yùn)算,計算 1+2+…+n 等于多少。具體的代碼如下:
3.如何調(diào)式
在 MySQL 中,存儲過程不像普通的編程語言(比如 VC++、Java 等)那樣有專門的集成開發(fā)環(huán)境。因此,你可以通過 SELECT 語句,把程序執(zhí)行的中間結(jié)果查詢出來,來調(diào)試一個 SQL 語句的正確性。調(diào)試成功之后,把 SELECT 語句后移到下一個 SQL 語句之后,再調(diào)試下一個 SQL 語句。這樣 逐步推進(jìn) ,就可以完成對存儲過程中所有操作的調(diào)試了。當(dāng)然,你也可以把存儲過程中的 SQL 語句復(fù)制出來,逐段單獨(dú)調(diào)試。

四. 存儲函數(shù)的使用
語法:
說明:
1、參數(shù)列表:指定參數(shù)為IN、OUT或INOUT只對PROCEDURE是合法的,F(xiàn)UNCTION中總是默認(rèn)為IN參數(shù)。?
2、RETURNS type 語句表示函數(shù)返回數(shù)據(jù)的類型; RETURNS子句只能對FUNCTION做指定,對函數(shù)而言這是 強(qiáng)制 的。它用來指定函數(shù)的返回類型,而且函數(shù)體必須包含一個 RETURN value 語句。?
3、characteristic 創(chuàng)建函數(shù)時指定的對函數(shù)的約束。取值與創(chuàng)建存儲過程時相同,這里不再贅述。?
4、函數(shù)體也可以用BEGIN…END來表示SQL代碼的開始和結(jié)束。如果函數(shù)體只有一條語句,也可以省略 BEGIN…END。

調(diào)用存儲函數(shù)

五.對比存儲函數(shù)和存儲過程

此外,存儲函數(shù)可以放在查詢語句中使用,存儲過程不行。反之,存儲過程的功能更加強(qiáng)大,包括能夠 執(zhí)行對表的操作(比如創(chuàng)建表,刪除表等)和事務(wù)操作,這些功能是存儲函數(shù)不具備的。

六.關(guān)于存儲過程使用的爭議
盡管存儲過程有諸多優(yōu)點(diǎn),但是對于存儲過程的使用,一直都存在著很多爭議,比如有些公司對于大型 項(xiàng)目要求使用存儲過程,而有些公司在手冊中明確禁止使用存儲過程,為什么這些公司對存儲過程的使用需求差別這么大呢?
優(yōu)點(diǎn)
1、存儲過程可以一次編譯多次使用。
2、可以減少開發(fā)工作量。
3、存儲過程的安全性強(qiáng)。
4、可以減少網(wǎng)絡(luò)傳輸量。
5、良好的封裝性。
缺點(diǎn)
1、可移植性差。
2、調(diào)試?yán)щy。
3、存儲過程的版本管理很困難。
4、它不適合高并發(fā)的場景。