MySQL之儲存過程
阿新 • • 發佈:2020-07-01
什麼是儲存過程
介紹:
經過預先編譯並存儲在資料庫中的一段SQL語句的集合,理解成批處理語句。
好處:
-
提高了sql語句的重用性,減少了開發人員的壓力。
-
減少資料在資料庫和應用伺服器之間的傳輸。
-
提高了資料處理的效率。
分類:
-
無返回無參。
-
僅僅帶in型別,無返回有參。
-
僅僅帶out型別,有返回無參。
-
既帶in又帶out,有返回有參。
-
帶inout,有返回有參。
提示:in、out、inout都可以在一個儲存過程中帶多個。
建立儲存過程
語法:
CREATE PROCEDURE 儲存過程名(引數列表)
BEGIN
儲存過程體(一組合法的SQL 語句)
END
引數列表:
引數模式 引數名 引數型別(例如:in stuname varchar(20))
引數模式:
in:該引數可以作為輸入,也就是該引數需要呼叫方傳入值。
out:該引數可以作為輸出,也就是該引數可以作為返回值。
inout:該引數既可以作為輸入又可以作為輸出,也就是該引數既需要傳入值,又可以返回值。
設定新的結束標記:
delimiter 新的結束標記(例如:delimiter $)
程式碼示例:
delimiter $ CREATE PROCEDURE 儲存過程名(IN|OUT|INOUT 引數名 引數型別,...) BEGIN sql語句1; sql語句2;END $
提示:
如果儲存過程體僅僅只有一句話,begin end可以省略。
儲存過程體中的每條sql語句的結尾要求必須加分號。
呼叫儲存過程
語法:
CALL 儲存過程名(實參列表);
示例程式碼:
/* * 1.空參列表 */ #案例:插入到admin表中五條記錄。 DELIMITER $ CREATE PROCEDURE myp1() BEGIN INSERT INTO admin(username,`password`) VALUES('john1','0000'),('lily','0000'),('rose','0000'),('jack','0000'),('tom','0000');END $ #呼叫 CALL myp1()$ /* * 2.建立帶in模式引數的儲存過程 */ #案例1:建立儲存過程,實現根據女神名查詢對應的男神資訊。 CREATE PROCEDURE myp2(IN beautyName VARCHAR(20)) BEGIN SELECT bo.* FROM boys bo RIGHT JOIN beauty b ON bo.id = b.boyfriend_id WHERE b.name = beautyName; END $ #呼叫 CALL myp2('柳巖')$ #案例2:建立儲存過程,實現使用者是否登入成功。 CREATE PROCEDURE myp3(IN username VARCHAR(20),IN PASSWORD VARCHAR(20)) BEGIN DECLARE result INT DEFAULT 0;#宣告並初始化 SELECT COUNT(*) INTO result#賦值 FROM admin WHERE admin.username = username AND admin.password = PASSWORD; SELECT IF(result>0,'成功','失敗');#使用 END $ #呼叫 CALL myp3('張飛','8888')$ /* * 3.建立out模式引數的儲存過程 */ #案例1:根據輸入的女神名,返回對應的男神名。 CREATE PROCEDURE myp6(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20)) BEGIN SELECT bo.boyname INTO boyname FROM boys bo RIGHT JOIN beauty b ON b.boyfriend_id = bo.id WHERE b.name=beautyName ; END $ #案例2:根據輸入的女神名,返回對應的男神名和魅力值。 CREATE PROCEDURE myp7(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20),OUT usercp INT) BEGIN SELECT boys.boyname ,boys.usercp INTO boyname,usercp FROM boys RIGHT JOIN beauty b ON b.boyfriend_id = boys.id WHERE b.name = beautyName; END $ #呼叫 CALL myp7('小昭',@name,@cp)$ SELECT @name,@cp$ /* * 4.建立帶inout模式引數的儲存過程 */ #案例1:傳入a和b兩個值,最終a和b都翻倍並返回。 CREATE PROCEDURE myp8(INOUT a INT ,INOUT b INT) BEGIN SET a=a*2; SET b=b*2; END $ #呼叫 SET @m=10$ SET @n=20$ CALL myp8(@m,@n)$ SELECT @m,@n$
刪除儲存過程
語法:
DROP PROCEDURE 儲存過程名;
程式碼示例:
DROP PROCEDURE p1; DROP PROCEDURE p2,p3;
檢視儲存過程的資訊
語法一:
DESC 儲存過程名;
語法二:
SHOW CREATE PROCEDURE 儲存過程名;
示例程式碼:
DESC myp2; SHOW CREATE PROCEDURE myp2;