MySQL教程徹底學(xué)懂存儲過程

1、存儲過程的相關(guān)概念
什么是存儲過程:
類似于java中的方法,python中的函數(shù)。
使用存儲過程的好處:
1、提高代碼的重用性;
2、簡化操作;
3、減少了編譯次數(shù),并且減少了和數(shù)據(jù)庫服務(wù)器的連接次數(shù),提高了效率。注意:平時每執(zhí)行一句sql語句,就會連接mysql服務(wù)器一次;
存儲過程的含義:
一組預(yù)先編譯好的SQL語句的集合。
2、存儲過程的用法
1)存儲過程的創(chuàng)建語法
create procedure 存儲過程名(參數(shù)列表)
begin
存儲過程體(一組合法有效的sql語句)
end
2)對創(chuàng)建語法的理解
① 參數(shù)列表:參數(shù)列表包含3部分
參數(shù)模式 參數(shù)名 參數(shù)類型 例如:in stuname varchar(20)
② 參數(shù)模式分類
in:該參數(shù)可以作為輸入,也就是該參數(shù),需要調(diào)用方傳入值。
out:該參數(shù)可以作為輸出,也就是該參數(shù),可以作為返回值。
inout:該參數(shù)既可以作為輸入又可以作為輸出,也就是該參數(shù)既需要傳入值,又可以返回值。
③ 如果存儲過程體僅僅只有一句話,begin/end可以省略。
Ⅰ 存儲過程體中的每條sql語句的結(jié)尾,要求必須加分號。
Ⅱ 存儲過程的結(jié)尾,可以使用delimiter重新設(shè)置,否則都用";"會造成混淆。
語法:delimiter 結(jié)束標(biāo)記
例如:delimiter $ -- 表示以$作為結(jié)尾符號。
④ 存儲過程的調(diào)用語法
call 存儲過程名(實參列表);
3.空參的存儲過程
"存儲過程的整個執(zhí)行過程,最好在CMD窗口中執(zhí)行"
-- 創(chuàng)建一個存儲過程
delimiter $
create procedure myp()
begin
insert into admin(username,`password`)
values ("tom","1111"),("jerry","2222"),
("jalen","3333"),("rose","4444"),("tonny","5555");
end $
-- 調(diào)用存儲過程
call myp()$
-- 查看結(jié)果。
select * from admin$
結(jié)果如下:

4.帶in模式的存儲過程

1)案例:創(chuàng)建存儲過程實現(xiàn),根據(jù)部門編號,查詢對應(yīng)的部門名稱。
-- 創(chuàng)建一個存儲過程
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)用存儲過程
call myp2(10)$
結(jié)果如下:

2)案例:創(chuàng)建一個存儲過程實現(xiàn),用戶是否登陸成功。

操作如下:
-- 創(chuàng)建一個存儲過程
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)用存儲過程
call myp3('john','8888');
結(jié)果如下:

5.帶out模式的存儲過程

1)案例1:創(chuàng)建一個存儲過程,根據(jù)女神姓名,返回對應(yīng)的男神姓名
-- 創(chuàng)建一個存儲過程
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)用
# 重新定義一個變量@boyname接收返回值boyName。
call myp4("趙敏",@boyname)$
select @boyname$
call myp4("柳巖",@boyname)$
select @boyname$
結(jié)果如下:

2)案例2:創(chuàng)建一個存儲過程,根據(jù)女神名,返回對應(yīng)的男神名和男神魅力值
-- 創(chuàng)建一個存儲過程
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)用
# 重新定義一個變量@boyname接收返回值boyName。
call myp5("趙敏",@boyname,@usercp)$
select @boyname,@usercp$
call myp5("柳巖",@boyname,@usercp)$
select @boyname,@usercp$
結(jié)果如下:

6.帶inout模式的存儲過程
1)案例1:傳入a和b兩個值,最終a和b都翻倍并返回。
-- 創(chuàng)建一個存儲過程
delimiter $
create procedure myp6(inout a int ,inout b int)
begin
-- 局部變量不用加@符號。
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.存儲過程的案例解析
1)創(chuàng)建存儲過程或函效,實現(xiàn)傳入用戶名和密碼,插入到admin表中。
2)創(chuàng)建儲過程或函數(shù),實現(xiàn)傳入女神編號,返回女神名稱和女神電話。
3)創(chuàng)建存儲存儲過程或函數(shù),實現(xiàn)傳入兩個女神生日,返回大小。
1)創(chuàng)建存儲過程或函效,實現(xiàn)傳入用戶名和密碼,插入到admin表中。
-- 創(chuàng)建一個存儲過程
delimiter $
create procedure pro1(in username varchar(20),in userpwd varchar(20))
begin
insert into admin(username,`password`)
values (username,userpwd);
end $
-- 調(diào)用存儲過程
call pro1("魯智深","123abc")$
select * from admin$
結(jié)果如下:

2)創(chuàng)建儲過程或函數(shù),實現(xiàn)傳入女神編號,返回女神名稱和女神電話。
-- 創(chuàng)建一個存儲過程
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)用存儲過程
call pro2(2,@beautyname,@beautyphone)$
select @beautyname,@beautyphone$
call pro2(3,@beautyname,@beautyphone)$
select @beautyname,@beautyphone$
結(jié)果如下:

3)創(chuàng)建存儲存儲過程或函數(shù),實現(xiàn)傳入兩個女神生日,返回大小。
-- 創(chuàng)建一個存儲過程
delimiter $
create procedure pro3(in borndate1 datetime,in borndate2 datetime,out result int)
begin
select datediff(borndate1,borndate2) into result;
end $
-- 調(diào)用存儲過程
call pro3("1993-8-12",now(),@result)$
select @result$
結(jié)果如下:

8.存儲過程的刪除
drop procedure 存儲過程名;
9.查看某個存儲過程的信息

10.存儲過程案例考核
1)創(chuàng)建存儲過程或函數(shù)實現(xiàn)傳入女神名稱,返回:女神AND男神,格式的字符串
如傳入:小昭
返回:小昭AND張無忌
2)創(chuàng)建存儲過程或函數(shù),根據(jù)傳入的條目數(shù)和起始索引,查詢beauty表的記錄。
1)創(chuàng)建存儲過程或函數(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)建存儲過程或函數(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é)懂存儲過程的詳細(xì)內(nèi)容,更多關(guān)于MySQL存儲過程的資料請關(guān)注本站其它相關(guān)文章!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。
關(guān)注官方微信