一、簡(jiǎn)介
從 5.0 版本才開(kāi)始支持,是一組為了完成特定功能的SQL語(yǔ)句集合(封裝),比傳統(tǒng)SQL速度更快、執(zhí)行效率更高。
存儲(chǔ)過(guò)程的優(yōu)點(diǎn)
1、執(zhí)行一次后,會(huì)將生成的二進(jìn)制代碼駐留緩沖區(qū)(便于下次執(zhí)行),提高執(zhí)行效率
2、SQL語(yǔ)句加上控制語(yǔ)句的集合,靈活性高
3、在服務(wù)器端存儲(chǔ),客戶端調(diào)用時(shí),降低網(wǎng)絡(luò)負(fù)載
4、可多次重復(fù)被調(diào)用,可隨時(shí)修改,不影響客戶端調(diào)用
5、 可完成所有的數(shù)據(jù)庫(kù)操作,也可控制數(shù)據(jù)庫(kù)的信息訪問(wèn)權(quán)限
為什么要用存儲(chǔ)過(guò)程?
1.減輕網(wǎng)絡(luò)負(fù)載;2.增加安全性
二、創(chuàng)建存儲(chǔ)過(guò)程
2.1 創(chuàng)建基本過(guò)程
使用create procedure語(yǔ)句創(chuàng)建存儲(chǔ)過(guò)程
存儲(chǔ)過(guò)程的主體部分,被稱為過(guò)程體;以begin開(kāi)始,以end$$結(jié)束
#聲明語(yǔ)句結(jié)束符,可以自定義: delimiter $$ #聲明存儲(chǔ)過(guò)程 create procedure 存儲(chǔ)過(guò)程名(in 參數(shù)名 參數(shù)類型) begin #定義變量 declare 變量名 變量類型 #變量賦值 set 變量名 = 值 sql 語(yǔ)句1; sql 語(yǔ)句2; ... end$$ #恢復(fù)為原來(lái)的語(yǔ)句結(jié)束符 delimiter ;(有空格)
實(shí)例:
mysql> delimiter $$ mysql> create procedure text() -> begin -> select * from stu.a_player; -> end $$ Query OK, 0 rows affected (0.00 sec) mysql> delimiter ;
調(diào)用存儲(chǔ)過(guò)程
call 存儲(chǔ)過(guò)程名(實(shí)際參數(shù)); mysql> call text; +----+----------+-------+ | id | name | score | +----+----------+-------+ | 1 | zhangsan | 88 | | 2 | lisi | 89 | | 3 | wangwu | 67 | | 4 | zhaoliu | 90 | | 5 | xuli | 80 | | 6 | keke | 75 | +----+----------+-------+ 6 rows in set (0.00 sec)
刪除存儲(chǔ)過(guò)程
mysql> drop procedure text;
2.2 存儲(chǔ)過(guò)程的參數(shù)
MySQL存儲(chǔ)過(guò)程的參數(shù)用在存儲(chǔ)過(guò)程的定義,共有三種參數(shù)類型,IN,OUT,INOUT,形式如:
CREATEPROCEDURE 存儲(chǔ)過(guò)程名([[IN |OUT |INOUT ] 參數(shù)名 數(shù)據(jù)類形...])
IN 輸入?yún)?shù):表示調(diào)用者向過(guò)程傳入值(傳入值可以是字面量或變量)
OUT 輸出參數(shù):表示過(guò)程向調(diào)用者傳出值(可以返回多個(gè)值)(傳出值只能是變量)
INOUT 輸入輸出參數(shù):既表示調(diào)用者向過(guò)程傳入值,又表示過(guò)程向調(diào)用者傳出值(值只能是變量)
傳遞參數(shù)實(shí)例:
IN
mysql> create procedure test1(in in_id int(2)) -> begin -> select * from stu.a_player where id=in_id; -> end $$ Query OK, 0 rows affected (0.00 sec) mysql> delimiter ; #將4傳遞給in_id變量,執(zhí)行事務(wù) mysql> call test1(4); +----+---------+-------+ | id | name | score | +----+---------+-------+ | 4 | zhaoliu | 90 | +----+---------+-------+ 1 row in set (0.00 sec) #將6傳遞給in_id變量,執(zhí)行事務(wù) mysql> call test1(6); +----+------+-------+ | id | name | score | +----+------+-------+ | 6 | keke | 75 | +----+------+-------+ 1 row in set (0.00 sec)
OUT
mysql> delimiter $$ mysql> create procedure test2(out aa int) -> begin -> select aa; -> set aa=2; -> select aa; -> end $$ Query OK, 0 rows affected (0.00 sec) mysql> delimiter ; #將@aa變量傳遞給test2 事務(wù) mysql> call test2(@aa); +------+ | aa | +------+ | NULL | +------+ #out向調(diào)用者輸出參數(shù),不接收輸入的參數(shù),所以aa為null 1 row in set (0.00 sec) +------+ | aa | +------+ | 2 | +------+ 事務(wù)將aa變量設(shè)置為2(設(shè)置的是全局),則可進(jìn)行輸出 1 row in set (0.00 sec) Query OK, 0 rows affected (0.00 sec) mysql> select @aa; +------+ | @aa | +------+ | 2 | +------+ 1 row in set (0.00 sec) #事務(wù)外查詢變量,已經(jīng)被修改
IN 、OUT、 INOUT 對(duì)比
mysql> delimiter // mysql> create procedure test3(in num1 int,out num2 int,inout num3 int) -> begin -> select num1,num2,num3; -> set num1=10,num2=20,num3=30; -> select num1,num2,num3; -> end // Query OK, 0 rows affected (0.00 sec) mysql> delimiter ; mysql> call test3(@num1,@num2,@num3); +------+------+------+ | num1 | num2 | num3 | +------+------+------+ | 1 | NULL | 3 | +------+------+------+ 1 row in set (0.00 sec) +------+------+------+ | num1 | num2 | num3 | +------+------+------+ | 10 | 20 | 30 | +------+------+------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.00 sec)
in和inout參數(shù)會(huì)將全局變量的值傳入存儲(chǔ)過(guò)程中,而out參數(shù)不會(huì)將全局變量的值傳入存儲(chǔ)過(guò)程中。在存儲(chǔ)過(guò)程使用中,參數(shù)值in,out,inout都會(huì)發(fā)生改變。
mysql> select @num1,@num2,@num3; +-------+-------+-------+ | @num1 | @num2 | @num3 | +-------+-------+-------+ | 1 | 20 | 30 | +-------+-------+-------+ 1 row in set (0.00 sec)
調(diào)用完存儲(chǔ)過(guò)程后,發(fā)現(xiàn)in參數(shù)不會(huì)對(duì)全局變量的值引起變化,而out和inout參數(shù)調(diào)用完存儲(chǔ)過(guò)程后,會(huì)對(duì)全局變量的值產(chǎn)生變化,會(huì)將存儲(chǔ)過(guò)程引用后的值賦值給全局變量。
in參數(shù)賦值類型可以是變量還有定值,而out和inout參數(shù)賦值類型必須為變量。
總結(jié)
到此這篇關(guān)于MySQL存儲(chǔ)過(guò)程(in、out、inout)的文章就介紹到這了,更多相關(guān)MySQL存儲(chǔ)過(guò)程(in、out、inout)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
標(biāo)簽:沈陽(yáng) 惠州 呼和浩特 牡丹江 合肥 公主嶺 天津 阿里
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MySQL存儲(chǔ)過(guò)程的深入講解(in、out、inout)》,本文關(guān)鍵詞 MySQL,存儲(chǔ),過(guò)程,的,深入,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。