MySQL自学笔记——存储过程
含義
存儲過程的英文是Stored Procedure。它的思想很簡單,就是一組經(jīng)過預(yù)先編譯的SQL語句的封裝。存儲過程預(yù)先存儲在MySQl服務(wù)器上,需要執(zhí)行的時(shí)候,客戶端只需要向服務(wù)器端發(fā)出調(diào)用存儲過程的命令,服務(wù)器端就可以把預(yù)先存儲好的這一系列SQL語句全部執(zhí)行。
好處
1、簡化操作,提高了sql語句的重用性,減少了開發(fā)程序員的壓力
2、減少操作過程中的失誤,提高效率
3、減少網(wǎng)絡(luò)傳輸量(客戶端不需要把所有的SQL語句通過網(wǎng)絡(luò)發(fā)給服務(wù)器)
4、減少了SQL語句暴露在網(wǎng)上的風(fēng)險(xiǎn),也提高了數(shù)據(jù)查詢的安全性
分類
存儲過程的參數(shù)類型可以是IN、OUT和INOUT。根據(jù)這點(diǎn)分類如下:
1、沒有參數(shù)(無參數(shù)無返回)
2、僅僅帶IN類型(有參數(shù)無返回)
3、僅僅帶OUT類型(無參數(shù)有返回)
4、既帶IN又帶OUT (有參數(shù)有返回)
5、帶INOUT?(有參數(shù)有返回)
注意:?IN、OUT、INOUT都可以在一個(gè)存儲過程中帶多個(gè)。
語法
CREATE PROCEDURE 存儲過程名(IN|OUT|INOUT 參數(shù)名,參數(shù)類型,...)
[characteritics...] #表示創(chuàng)建存儲過程時(shí)指定的對存儲過程的約束條件
BEGIN
? ? ?存儲過程體
END
?characteristics 取值信息如下:
LANGUAGE?SQL
|?[NOT]?DETERMINISTIC
|?{?CONTAINS?SQL? ?|? ?NO?SQL? ?I? ?READS?SQL?DATA? ?I? ?MODIFIES?SQL?DATA}
|?SQL?SECURITY?{?DEFINER? ?|? ?INVOKER?}
|?COMMENT?‘string'
?LANGUAGE?SQL?:說明存儲過程執(zhí)行體是由SQL語句組成的,當(dāng)前系統(tǒng)支持的語言為SQL
[NOT]?DETERMINISTIC:?指明存儲過程執(zhí)行的結(jié)果是否確定。
DETERMINISTIC表示結(jié)果是確定的。?每次執(zhí)行存儲過程時(shí),相同的輸入會得到相同的輸出。NOT?DETERMINISTIC表示結(jié)果是不確定的,相同的輸入可能得到不同的輸出。
如果沒有指定任意一個(gè)值,?默認(rèn)為NOT?DETERMINISTIC
{?CONTAINS?SQLI?NO?SQL?|?READS?SQL?DATA?|?MODIFIES?SQL?DATA?} :指明子程序使用SQL語句的限制。
ONTAINS?SQL表示當(dāng)前存儲過程的子程序包含SQL語句,但是并不包含讀寫數(shù)據(jù)的SQL語句;
NO?SQL表示當(dāng)前存儲過程的子程序中不包含任何SQL語句;
READS?SQL?DATA表示當(dāng)前存儲過程的子程序中包含讀數(shù)據(jù)的SQL語句;
MODIFIES?SQL?DATA表示當(dāng)前存儲過程的子程序中包含寫數(shù)據(jù)的SQL語句。
默認(rèn)情況下,系統(tǒng)會指定為CONTAINS?SQL.
SQL?SECURITY?{DEFINER? |??INVOKER}:執(zhí)行當(dāng)前存儲過程的權(quán)限,即指明哪些用戶能夠執(zhí)行當(dāng)前存儲過程
DEFINER?表示只有當(dāng)前存儲過程的創(chuàng)建者或者定義者才能執(zhí)行當(dāng)前存儲過程
INVOKER表示擁有當(dāng)前存儲過程的訪問權(quán)限的用戶能夠執(zhí)行當(dāng)前存儲過程
如果沒有設(shè)置相關(guān)的值,則MySQL默認(rèn)指定值為DEFINER。
COMMENT?‘string'
注釋信息,可以用來描述存儲過程。
知識點(diǎn)補(bǔ)充:DELIMITER(新的結(jié)束標(biāo)記)
因?yàn)镸ySQL默認(rèn)的語句結(jié)束符號為分號。為了避免與存儲過程中SQL語句結(jié)束符相沖突,需要使用DELIMITER改變存儲過程的結(jié)束符。
比如:“DELIMITER?//語句的作用是將MySQL的結(jié)束符設(shè)置為//,并以“END?//"結(jié)束存儲過程。存儲過程定義完畢之后再使用"DELIMITER?;”恢復(fù)默認(rèn)結(jié)束符。DELIMITER也可以指定其他符號作為結(jié)束符。
當(dāng)使用DELIMITER命令時(shí),應(yīng)該避免使用反斜杠('\')?字符,因?yàn)榉葱本€是MySQL的轉(zhuǎn)義字符。
?使用存儲過程:
CALL select_all_data();帶OUT參數(shù)
DELIMITER $CREATE PROCEDURE show_min_salary(OUT ms DECIMAL(10,2)) BEGINSELECT min(salary) INTO msfrom demo; END $DELIMITER ;使用存儲過程:?
CALL show_min_salary(@ms);SELECT @ms?帶IN參數(shù)
DELIMITER $CREATE PROCEDURE show_someone_salary(IN empid int) BEGINSELECT salary from demoWHERE id=empid; END $DELIMITER ;使用存儲過程:
CALL show_someone_salary(2)?帶IN和OUT參數(shù)
DELIMITER //create procedure show_someone_salary2(IN empid int , OUT empsalary DECIMAL(10,2)) beginselect salary into empsalaryfrom demowhere id=empid; end //DELIMITER ;使用存儲過程:
set @empid=1; call show_someone_salary2(@empid,@empsalary);select @empsalary帶INOUT參數(shù)
DELIMITER //create procedure show_salary(INOUT empid int) BEGINSELECT salary into empidfrom demowhere id=empid; END //DELIMITER ;?使用存儲過程:
set @empid=2;CALL show_salary(@empid);SELECT @empid;存儲函數(shù)
語法
CREATE FUNCTION 函數(shù)名(參數(shù)名 參數(shù)類型)
RETURNS 返回值類型
[characteristics ...]??#表示創(chuàng)建存儲過程時(shí)指定的對存儲過程的約束條件
BEGIN
? ? ? ? ? ? 函數(shù)體? #函數(shù)體中肯定有 RETURN 語句
END
?characteristics詳情見存儲過程
?例子:
CREATE FUNCTION email_by_id() RETURNS VARCHAR(20)DETERMINISTICCONTAINS SQLREADS SQL DATA BEGINRETURN(SELECT email FROM demo WHERE manager_id=1); END CREATE FUNCTION email_by_id(emp_id INT) RETURNS varchar(20)DETERMINISTICCONTAINS SQLREADS SQL DATA BEGINRETURN(SELECT email FROM demo WHERE manager_id=emp_id); END調(diào)用
SELECT 函數(shù)名(實(shí)參列表)?
SELECT email_by_id(); OR SELECT email_by_id(1);對比存儲函數(shù)和存儲過程
| 關(guān)鍵字 | 調(diào)用語法 | 返回值 | 應(yīng)用場景 | |
| 存儲過程 | PORCEDURE | CALL? 存儲過程() | 有0個(gè)或者多個(gè) | 一般用于更新 |
| 存儲函數(shù) | FUNCTION | SELECT 函數(shù)() | 只能是一個(gè) | 一般用于查詢結(jié)果為一個(gè)值并返回時(shí) |
此外,存儲函數(shù)可以放在查詢語句中使用,存儲過程不行。但存儲過程的功能更加強(qiáng)大,包括能過執(zhí)行對表的操作,這些是存儲函數(shù)不具備的?
存儲過程和函數(shù)的查看、修改、刪除
查看
SHOW? ?CREATE? ?PROCEDURE? /? FUNCTION? 存儲過程名或函數(shù)名
SHOW? ?PROCEDURE? /? ?FUNCTION? STATUS??
SHOW? ?PROCEDURE? /? ?FUNCTION? STATUS? LIKE? 模糊查詢
SELECT * FROM information_schema.ROUTINES
WHERE ROUTINE_NAME=' 函數(shù)名 / 存儲過程名?'
AND ROUTINE_TYPE='FUNCTION / PROCEDRE'(這里必須為大寫)
?修改
修改存儲過程或函數(shù),不影響存儲函數(shù)或函數(shù)的功能,只是修改相關(guān)特性
ALTER? PROCEDURE /? FUNCTION? 存儲過程或函數(shù)名??[characteristics ...]
? 此處characteristics 取值信息如下:
{?CONTAINS?SQL? ?|? ?NO?SQL? ?I? ?READS?SQL?DATA? ?I? ?MODIFIES?SQL?DATA}
|?SQL?SECURITY?{?DEFINER? ?|? ?INVOKER?}
|?COMMENT?‘string'
例子:?
ALTER FUNCTION email_by_id SQL SECURITY INVOKER COMMENT 'abababa'刪除?
DROP? PROCEDURE /? FUNCTION? 存儲過程或函數(shù)名
總結(jié)
以上是生活随笔為你收集整理的MySQL自学笔记——存储过程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基层员工和领导者的区别,悟到这一层,你也
- 下一篇: linux cmake编译源码,linu