MySQL教程徹底學(xué)懂存儲(chǔ)過程
1、存儲(chǔ)過程的相關(guān)概念
什么是存儲(chǔ)過程:
類似于java中的方法,python中的函數(shù)。
使用存儲(chǔ)過程的好處:
1、提高代碼的重用性;
2、簡(jiǎn)化操作;
3、減少了編譯次數(shù),并且減少了和數(shù)據(jù)庫(kù)服務(wù)器的連接次數(shù),提高了效率。注意:平時(shí)每執(zhí)行一句sql語句,就會(huì)連接mysql服務(wù)器一次;
存儲(chǔ)過程的含義:
一組預(yù)先編譯好的SQL語句的集合。
2、存儲(chǔ)過程的用法
1)存儲(chǔ)過程的創(chuàng)建語法
create procedure 存儲(chǔ)過程名(參數(shù)列表) begin 存儲(chǔ)過程體(一組合法有效的sql語句) end
2)對(duì)創(chuàng)建語法的理解
① 參數(shù)列表:參數(shù)列表包含3部分
參數(shù)模式 參數(shù)名 參數(shù)類型 例如:in stuname varchar(20)
② 參數(shù)模式分類
in:該參數(shù)可以作為輸入,也就是該參數(shù),需要調(diào)用方傳入值。
out:該參數(shù)可以作為輸出,也就是該參數(shù),可以作為返回值。
inout:該參數(shù)既可以作為輸入又可以作為輸出,也就是該參數(shù)既需要傳入值,又可以返回值。
③ 如果存儲(chǔ)過程體僅僅只有一句話,begin/end可以省略。
Ⅰ 存儲(chǔ)過程體中的每條sql語句的結(jié)尾,要求必須加分號(hào)。
Ⅱ 存儲(chǔ)過程的結(jié)尾,可以使用delimiter重新設(shè)置,否則都用";"會(huì)造成混淆。
語法:delimiter 結(jié)束標(biāo)記
例如:delimiter $ -- 表示以$作為結(jié)尾符號(hào)。
④ 存儲(chǔ)過程的調(diào)用語法
call 存儲(chǔ)過程名(實(shí)參列表);
3.空參的存儲(chǔ)過程
"存儲(chǔ)過程的整個(gè)執(zhí)行過程,最好在CMD窗口中執(zhí)行" -- 創(chuàng)建一個(gè)存儲(chǔ)過程 delimiter $ create procedure myp() begin insert into admin(username,`password`) values ("tom","1111"),("jerry","2222"), ("jalen","3333"),("rose","4444"),("tonny","5555"); end $ -- 調(diào)用存儲(chǔ)過程 call myp()$ -- 查看結(jié)果。 select * from admin$
結(jié)果如下:
4.帶in模式的存儲(chǔ)過程
1)案例:創(chuàng)建存儲(chǔ)過程實(shí)現(xiàn),根據(jù)部門編號(hào),查詢對(duì)應(yīng)的部門名稱。
-- 創(chuàng)建一個(gè)存儲(chǔ)過程 delimiter $ create procedure myp2(in num int) begin select e.ename,d.dname from emp e left join dept d on e.deptno=d.deptno where e.deptno=num; end $ -- 調(diào)用存儲(chǔ)過程 call myp2(10)$
結(jié)果如下:
2)案例:創(chuàng)建一個(gè)存儲(chǔ)過程實(shí)現(xiàn),用戶是否登陸成功。
操作如下:
-- 創(chuàng)建一個(gè)存儲(chǔ)過程 delimiter $ create procedure myp3(in username varchar(10),password varchar(10)) begin declare result int; select count(*) into result from admin ad where ad.username=username and ad.password=password; select if(count(*) > 0,"登陸成功","登陸失敗") 登陸狀態(tài); end $ -- 調(diào)用存儲(chǔ)過程 call myp3('john','8888');
結(jié)果如下:
5.帶out模式的存儲(chǔ)過程
1)案例1:創(chuàng)建一個(gè)存儲(chǔ)過程,根據(jù)女神姓名,返回對(duì)應(yīng)的男神姓名
-- 創(chuàng)建一個(gè)存儲(chǔ)過程 delimiter $ create procedure myp4(in beautyName varchar(20),out boyName varchar(20)) begin select b.boyName into boyName from beauty left join boys b on beauty.boyfriend_id=b.id where beauty.name=beautyName; end $ -- 調(diào)用 # 重新定義一個(gè)變量@boyname接收返回值boyName。 call myp4("趙敏",@boyname)$ select @boyname$ call myp4("柳巖",@boyname)$ select @boyname$
結(jié)果如下:
2)案例2:創(chuàng)建一個(gè)存儲(chǔ)過程,根據(jù)女神名,返回對(duì)應(yīng)的男神名和男神魅力值
-- 創(chuàng)建一個(gè)存儲(chǔ)過程 delimiter $ create procedure myp5(in beautyName varchar(20),out boyName varchar(20),out userCP int) begin select b.boyName,b.userCP into boyName,userCP from beauty left join boys b on beauty.boyfriend_id=b.id where beauty.name=beautyName; end $ -- 調(diào)用 # 重新定義一個(gè)變量@boyname接收返回值boyName。 call myp5("趙敏",@boyname,@usercp)$ select @boyname,@usercp$ call myp5("柳巖",@boyname,@usercp)$ select @boyname,@usercp$
結(jié)果如下:
6.帶inout模式的存儲(chǔ)過程
1)案例1:傳入a和b兩個(gè)值,最終a和b都翻倍并返回。
-- 創(chuàng)建一個(gè)存儲(chǔ)過程 delimiter $ create procedure myp6(inout a int ,inout b int) begin -- 局部變量不用加@符號(hào)。 set a=a*2; set b=b*2; end $ -- 調(diào)用 -- 特別注意調(diào)用這一塊兒。 set @m=10$ set @n=20$ call myp6(@m,@n)$ select @m,@n$
結(jié)果如下:
7.存儲(chǔ)過程的案例解析
1)創(chuàng)建存儲(chǔ)過程或函效,實(shí)現(xiàn)傳入用戶名和密碼,插入到admin表中。
2)創(chuàng)建儲(chǔ)過程或函數(shù),實(shí)現(xiàn)傳入女神編號(hào),返回女神名稱和女神電話。
3)創(chuàng)建存儲(chǔ)存儲(chǔ)過程或函數(shù),實(shí)現(xiàn)傳入兩個(gè)女神生日,返回大小。
1)創(chuàng)建存儲(chǔ)過程或函效,實(shí)現(xiàn)傳入用戶名和密碼,插入到admin表中。
-- 創(chuàng)建一個(gè)存儲(chǔ)過程 delimiter $ create procedure pro1(in username varchar(20),in userpwd varchar(20)) begin insert into admin(username,`password`) values (username,userpwd); end $ -- 調(diào)用存儲(chǔ)過程 call pro1("魯智深","123abc")$ select * from admin$
結(jié)果如下:
2)創(chuàng)建儲(chǔ)過程或函數(shù),實(shí)現(xiàn)傳入女神編號(hào),返回女神名稱和女神電話。
-- 創(chuàng)建一個(gè)存儲(chǔ)過程 delimiter $ create procedure pro2(in id int,out beautyName varchar(20),out beautyPhone varchar(20)) begin select beauty.name,beauty.phone into beautyName,beautyPhone from beauty where beauty.id=id; end $ -- 調(diào)用存儲(chǔ)過程 call pro2(2,@beautyname,@beautyphone)$ select @beautyname,@beautyphone$ call pro2(3,@beautyname,@beautyphone)$ select @beautyname,@beautyphone$
結(jié)果如下:
3)創(chuàng)建存儲(chǔ)存儲(chǔ)過程或函數(shù),實(shí)現(xiàn)傳入兩個(gè)女神生日,返回大小。
-- 創(chuàng)建一個(gè)存儲(chǔ)過程 delimiter $ create procedure pro3(in borndate1 datetime,in borndate2 datetime,out result int) begin select datediff(borndate1,borndate2) into result; end $ -- 調(diào)用存儲(chǔ)過程 call pro3("1993-8-12",now(),@result)$ select @result$
結(jié)果如下:
8.存儲(chǔ)過程的刪除
drop procedure 存儲(chǔ)過程名;
9.查看某個(gè)存儲(chǔ)過程的信息
10.存儲(chǔ)過程案例考核
1)創(chuàng)建存儲(chǔ)過程或函數(shù)實(shí)現(xiàn)傳入女神名稱,返回:女神AND男神,格式的字符串
如傳入:小昭
返回:小昭AND張無忌
2)創(chuàng)建存儲(chǔ)過程或函數(shù),根據(jù)傳入的條目數(shù)和起始索引,查詢beauty表的記錄。
1)創(chuàng)建存儲(chǔ)過程或函數(shù),實(shí)現(xiàn)傳入女神名稱,返回:女神AND男神,格式的字符串。
delimiter $ create procedure test1(in beautyname varchar(20)) begin select concat(beauty.name,"AND",boys.boyName) from beauty left join boys on beauty.boyfriend_id=boys.id where beauty.name=beautyname; end $ call test1("柳巖")$ call test1("趙敏")$
結(jié)果如下:
2)創(chuàng)建存儲(chǔ)過程或函數(shù),根據(jù)傳入的條目數(shù)和起始索引,查詢beauty表的記錄。
delimiter $ create procedure test2(in startIndex int,in length int) begin select * from beauty limit startIndex,length; end $ -- 每頁顯示3條記錄 -- 顯示第2頁 call test2(3,3)$ -- 顯示第3頁 call test2(6,3)$
結(jié)果如下:
以上就是MySQL系列徹底學(xué)懂存儲(chǔ)過程的詳細(xì)內(nèi)容,更多關(guān)于MySQL存儲(chǔ)過程的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
phpstudy無法啟動(dòng)MySQL服務(wù)的完美解決辦法
學(xué)習(xí)php當(dāng)然是要先安裝好運(yùn)行環(huán)境了,phpstyudy是一個(gè)運(yùn)行php的集成環(huán)境,一鍵安裝對(duì)新手很友好,下面這篇文章主要給大家介紹了關(guān)于phpstudy無法啟動(dòng)MySQL服務(wù)的完美解決辦法,需要的朋友可以參考下2022-06-06詳解MySQL 5.7 MGR單主確定主節(jié)點(diǎn)方法
這篇文章主要介紹了詳解MySQL 5.7 MGR單主確定主節(jié)點(diǎn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09關(guān)于mysql中string和number的轉(zhuǎn)換問題
這篇文章主要介紹了關(guān)于mysql中string和number的轉(zhuǎn)換問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06MySQL用戶管理與PostgreSQL用戶管理的區(qū)別說明
這篇文章主要介紹了MySQL用戶管理與PostgreSQL用戶管理的區(qū)別說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01Mysql 存儲(chǔ)過程中使用游標(biāo)循環(huán)讀取臨時(shí)表
這篇文章主要介紹了Mysql 存儲(chǔ)過程中使用游標(biāo)循環(huán)讀取臨時(shí)表的方法,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下2020-12-12Mysql調(diào)優(yōu)Explain工具詳解及實(shí)戰(zhàn)演練(推薦)
這篇文章主要介紹了Mysql調(diào)優(yōu)Explain工具詳解及實(shí)戰(zhàn)演練,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03設(shè)置MySQLroot賬戶密碼報(bào)錯(cuò)ERROR 1064 (42000): You 
在安裝mysql的時(shí)候,設(shè)置root賬戶密碼出現(xiàn)了ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds..錯(cuò)誤,本文小編給大家介紹了相關(guān)的解決方案,需要的朋友可以參考下2023-12-12