MySQL:存儲(chǔ)過程

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

注意:

  1. 參數(shù)列表包含三部分:參數(shù)模式 參數(shù)名 參數(shù)類型( 例:IN stuname VARCHAR(20)
  2. 參數(shù)模式有三種:
  • IN:該參數(shù)可以作為輸入,也就是說該參數(shù)需要調(diào)用方傳入值
  • OUT:該參數(shù)可以作為輸出,也就是該參數(shù)可以作為返回值
  • INOUT:該參數(shù)既可以作為輸入又可以作為輸出,也就是該參數(shù)既需要傳入值,又可以返回值
  1. 如果存儲(chǔ)過程體只有一條語(yǔ)句,則BEGIN和END可以省略
  2. 存儲(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 ;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容