日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL自学笔记——存储过程

發(fā)布時(shí)間:2024/1/18 数据库 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL自学笔记——存储过程 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

含義

存儲過程的英文是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)義字符。

DELIMITER $CREATE PROCEDURE select_all_data() BEGINSELECT * from demo; END $DELIMITER ;

?使用存儲過程:

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)用場景
存儲過程PORCEDURECALL? 存儲過程()有0個(gè)或者多個(gè)一般用于更新
存儲函數(shù)FUNCTIONSELECT 函數(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。