1. 含義
一組預(yù)先編譯好的SQL語(yǔ)句的集合
2. 好處
提高代碼的重用性
簡(jiǎn)化操作
減少了編譯次數(shù)并且減少了和數(shù)據(jù)庫(kù)服務(wù)器的連接次數(shù),提高了效率
3. 語(yǔ)法
創(chuàng)建
CREATE PROCEDURE 存儲(chǔ)過程名 (參數(shù)列表)
BEGIN
存儲(chǔ)過程體(一組合法的SQL語(yǔ)句)
END
注意:
- 參數(shù)列表包含三部分:參數(shù)模式 參數(shù)名 參數(shù)類型( 例:
IN stuname VARCHAR(20)) - 參數(shù)模式有三種:
- IN:該參數(shù)可以作為輸入,也就是說該參數(shù)需要調(diào)用方傳入值
- OUT:該參數(shù)可以作為輸出,也就是該參數(shù)可以作為返回值
- INOUT:該參數(shù)既可以作為輸入又可以作為輸出,也就是該參數(shù)既需要傳入值,又可以返回值
- 如果存儲(chǔ)過程體只有一條語(yǔ)句,則BEGIN和END可以省略
- 存儲(chǔ)過程體中的每條SQL語(yǔ)句的結(jié)尾要求必須加分號(hào),存儲(chǔ)過程的結(jié)尾可以使用 DELIMITER 重新設(shè)置,例:
DELIMITER $
調(diào)用
CALL 存儲(chǔ)過程名 (實(shí)參列表) ;
4. 實(shí)例(使用命令行)
空參列表
- 插入到admin表中五條記錄
-- 創(chuàng)建,將語(yǔ)句的結(jié)束標(biāo)記改成$
DELIMITER $
CREATE PROCEDURE myp1 ()
BEGIN
INSERT INTO `admin` (`username`, `password`)
VALUES
('費(fèi)渡', '1234'),
('簡(jiǎn)隋英', '1234'),
('李玉', '1234'),
('駱聞舟', '1234'),
('趙錦辛', '1234') ;
END $
-- 調(diào)用
CALL myp1 () $
-- 查看
select * from admin $
帶IN模式參數(shù)的存儲(chǔ)過程
- 根據(jù)女神名去查詢對(duì)應(yīng)的男神信息
-- 創(chuàng)建
CREATE PROCEDURE myp2 (IN beauty_name VARCHAR (20))
BEGIN
SELECT
bo.*
FROM
`beauty` AS b
RIGHT JOIN `boys` AS bo
ON b.`boyfriend_id` = bo.`id`
WHERE b.`name` = beauty_name ;
END $
-- 調(diào)用
CALL myp2 ('費(fèi)渡') $
- 判斷用戶是否登錄成功
-- 創(chuàng)建
CREATE PROCEDURE myp3 (
IN username VARCHAR (10),
IN `password` VARCHAR (10)
)
BEGIN
DECLARE nums INT ;
SELECT
COUNT(*) INTO nums
FROM
`admin` AS a
WHERE a.`username` = username
AND a.`password` = `password` ;
SELECT
IF (
nums = 1,
"登錄成功",
"登錄失敗"
) AS result ;
END $
-- 調(diào)用
CALL myp3 ('費(fèi)渡', '1234') $
帶OUT模式的存儲(chǔ)過程
- 根據(jù)女神名,返回對(duì)應(yīng)的男神名
-- 創(chuàng)建
CREATE PROCEDURE myp4 (
IN beauty_name VARCHAR (50),
OUT boy_name VARCHAR (20)
)
BEGIN
SELECT
bo.`boyName` INTO boy_name
FROM
`beauty` AS b
RIGHT JOIN `boys` AS bo
ON b.`boyfriend_id` = bo.`id`
WHERE b.`name` = beauty_name ;
END $
-- 調(diào)用
CALL myp4 ('費(fèi)渡', @name) $
SELECT
@name $
- 根據(jù)根據(jù)女神名,返回對(duì)應(yīng)的男神名和魅力值
-- 創(chuàng)建
CREATE PROCEDURE myp5 (
IN beauty_name VARCHAR (50),
OUT boy_name VARCHAR (20),
OUT user_cp INT
)
BEGIN
SELECT
bo.`boyName`,
bo.`userCP` INTO boy_name,
user_cp
FROM
`beauty` AS b
RIGHT JOIN `boys` AS bo
ON b.`boyfriend_id` = bo.`id`
WHERE b.`name` = beauty_name ;
END $
-- 調(diào)用
CALL myp5 ('費(fèi)渡', @name, @`value`) $
SELECT
@name,
@`value` $
帶INOUT模式參數(shù)的存儲(chǔ)過程
- 傳入兩個(gè)值,得到兩個(gè)值的二倍
-- 創(chuàng)建
CREATE PROCEDURE myp6 (INOUT a INT, INOUT b INT)
BEGIN
SET a = a * 2 ;
SET b = b * 2 ;
END $
-- 調(diào)用
SET @a = 3 $
SET @b = 4 $
CALL myp6 (@a, @b) $
SELECT
@a,
@b $
5. 其他操作
刪除存儲(chǔ)過程
-- 不支持一次刪除多個(gè)
DROP PROCEDURE myp1 ;
查看存儲(chǔ)過程的信息
SHOW CREATE PROCEDURE myp2 ;