十三、MySQL存储过程相关知识总结 + 案例讲解(强化)
一、存儲(chǔ)過程VS函數(shù)
存儲(chǔ)過程和函數(shù):類似于java中的方法
好處:
1、提高代碼的重用性
2、簡化操作
二、存儲(chǔ)過程
含義:一組預(yù)先編譯好的SQL語句的集合,理解成批處理語句
1、提高代碼的重用性
2、簡化操作
3、減少了編譯次數(shù)并且減少了和數(shù)據(jù)庫服務(wù)器的連接次數(shù),提高了效率
(一)創(chuàng)建語法
CREATE PROCEDURE 存儲(chǔ)過程名(參數(shù)列表)
BEGIN
存儲(chǔ)過程體(一組合法的SQL語句)
END
注意:
參數(shù)模式 參數(shù)名 參數(shù)類型
舉例:
in stuname varchar(20)
參數(shù)模式:
in:該參數(shù)可以作為輸入,也就是該參數(shù)需要調(diào)用方傳入值
out:該參數(shù)可以作為輸出,也就是該參數(shù)可以作為返回值
inout:該參數(shù)既可以作為輸入又可以作為輸出,也就是該參數(shù)既需要傳入值,又可以返回值
存儲(chǔ)過程體中的每條sql語句的結(jié)尾要求必須加分號(hào)。
存儲(chǔ)過程的結(jié)尾可以使用 delimiter 重新設(shè)置
語法:
delimiter 結(jié)束標(biāo)記
案例:
delimiter $
(二)調(diào)用語法
CALL 存儲(chǔ)過程名(實(shí)參列表);
案例演示:
案例2 :創(chuàng)建存儲(chǔ)過程實(shí)現(xiàn),用戶是否登錄成功
CREATE PROCEDURE myp4(IN username VARCHAR(20),IN PASSWORD VARCHAR(20)) BEGINDECLARE result INT DEFAULT 0;#聲明并初始化SELECT COUNT(*) INTO result#賦值FROM adminWHERE admin.username = usernameAND admin.password = PASSWORD;SELECT IF(result>0,'成功','失敗');#使用 END $#調(diào)用 CALL myp3('張飛','8888')$3.創(chuàng)建out 模式參數(shù)的存儲(chǔ)過程
#案例1:根據(jù)輸入的女神名,返回對(duì)應(yīng)的男神名CREATE PROCEDURE myp6(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20)) BEGINSELECT bo.boyname INTO boynameFROM boys boRIGHT JOINbeauty b ON b.boyfriend_id = bo.idWHERE b.name=beautyName ;END $#案例2:根據(jù)輸入的女神名,返回對(duì)應(yīng)的男神名和魅力值CREATE PROCEDURE myp7(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20),OUT usercp INT) BEGINSELECT boys.boyname ,boys.usercp INTO boyname,usercpFROM boys RIGHT JOINbeauty b ON b.boyfriend_id = boys.idWHERE b.name=beautyName ;END $#調(diào)用 CALL myp7('小昭',@name,@cp)$ SELECT @name,@cp$4.創(chuàng)建帶inout模式參數(shù)的存儲(chǔ)過程
#案例1:傳入a和b兩個(gè)值,最終a和b都翻倍并返回CREATE PROCEDURE myp8(INOUT a INT ,INOUT b INT) BEGINSET a=a*2;SET b=b*2; END $#調(diào)用 SET @m=10$ SET @n=20$ CALL myp8(@m,@n)$ SELECT @m,@n$(三)刪除存儲(chǔ)過程
語法:drop procedure 存儲(chǔ)過程名
DROP PROCEDURE p1;
DROP PROCEDURE p2,p3;#×
(四)查看存儲(chǔ)過程的信息
DESC myp2;×
SHOW CREATE PROCEDURE myp2;
(五)修改存儲(chǔ)過程(X)
無法對(duì)存儲(chǔ)過程進(jìn)行修改,只能通過先刪除存儲(chǔ)過程再新增存儲(chǔ)過程的方法來間接實(shí)現(xiàn)修改!
三、存儲(chǔ)過程案例講解
#一、創(chuàng)建存儲(chǔ)過程實(shí)現(xiàn)傳入用戶名和密碼,插入到admin表中CREATE PROCEDURE test_pro1(IN username VARCHAR(20),IN loginPwd VARCHAR(20)) BEGININSERT INTO admin(admin.username,PASSWORD)VALUES(username,loginpwd); END $ #二、創(chuàng)建存儲(chǔ)過程實(shí)現(xiàn)傳入女神編號(hào),返回女神名稱和女神電話CREATE PROCEDURE test_pro2(IN id INT,OUT NAME VARCHAR(20),OUT phone VARCHAR(20))BEGINSELECT b.name ,b.phone INTO NAME,phoneFROM beauty bWHERE b.id = id;END $ #三、創(chuàng)建存儲(chǔ)存儲(chǔ)過程或函數(shù)實(shí)現(xiàn)傳入兩個(gè)女神生日,返回大小CREATE PROCEDURE test_pro3(IN birth1 DATETIME,IN birth2 DATETIME,OUT result INT) BEGINSELECT DATEDIFF(birth1,birth2) INTO result; END $ #四、創(chuàng)建存儲(chǔ)過程或函數(shù)實(shí)現(xiàn)傳入一個(gè)日期,格式化成xx年xx月xx日并返回 CREATE PROCEDURE test_pro4(IN mydate DATETIME,OUT strDate VARCHAR(50)) BEGINSELECT DATE_FORMAT(mydate,'%y年%m月%d日') INTO strDate; END $CALL test_pro4(NOW(),@str)$ SELECT @str $ #五、創(chuàng)建存儲(chǔ)過程或函數(shù)實(shí)現(xiàn)傳入女神名稱,返回:女神 and 男神 格式的字符串 如 傳入 :小昭 返回: 小昭 AND 張無忌 DROP PROCEDURE test_pro5 $ CREATE PROCEDURE test_pro5(IN beautyName VARCHAR(20),OUT str VARCHAR(50)) BEGINSELECT CONCAT(beautyName,' and ',IFNULL(boyName,'null')) INTO strFROM boys boRIGHT JOIN beauty b ON b.boyfriend_id = bo.idWHERE b.name=beautyName; END $CALL test_pro5('柳巖',@str)$ SELECT @str $ #六、創(chuàng)建存儲(chǔ)過程或函數(shù),根據(jù)傳入的條目數(shù)和起始索引,查詢beauty表的記錄 DROP PROCEDURE test_pro6$ CREATE PROCEDURE test_pro6(IN startIndex INT,IN size INT) BEGINSELECT * FROM beauty LIMIT startIndex,size; END $CALL test_pro6(3,5)$總結(jié)
以上是生活随笔為你收集整理的十三、MySQL存储过程相关知识总结 + 案例讲解(强化)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二、SpringMVC 注解式开发学习笔
- 下一篇: 一、mongodb数据库系列——介绍和安