MySQL存儲(chǔ)過(guò)程使用解析
mysql存儲(chǔ)過(guò)程
存儲(chǔ)過(guò)程(Stored Procedure)是一種在數(shù)據(jù)庫(kù)中存儲(chǔ)復(fù)雜程序,以便外部程序調(diào)用的一種數(shù)據(jù)庫(kù)對(duì)象。目的是為了完成特定功能的SQL語(yǔ)句集,經(jīng)編譯創(chuàng)建并保存在數(shù)據(jù)庫(kù)中,用戶可通過(guò)指定存儲(chǔ)過(guò)程的名字并給定參數(shù)(需要時(shí))來(lái)調(diào)用執(zhí)行。說(shuō)白了就是數(shù)據(jù)庫(kù) SQL語(yǔ)言層面的代碼封裝與重用。創(chuàng)建的存儲(chǔ)過(guò)程通常保存在數(shù)據(jù)庫(kù)的數(shù)據(jù)字典中。
1.創(chuàng)建存儲(chǔ)過(guò)程
- create procedure 存儲(chǔ)過(guò)程名(參數(shù)列表)
 - begin
 - 存儲(chǔ)過(guò)程體(一組合法的sql語(yǔ)句)
 - end
 
參數(shù)列表包含3個(gè)部分:
- 參數(shù)模式 參數(shù)名 參數(shù)類型。
 - 舉例:IN userid varchar(20)
 - 參數(shù)模式有3個(gè):
 
- in:傳入接收
 - out:輸出,作為返回值
 - inout:既可以作為輸入,也可作為輸出
 
begin ... end 使用:
- 如果存儲(chǔ)過(guò)程體僅有一句話,begin end 可以不寫
 - 存儲(chǔ)過(guò)程的每條sql語(yǔ)句結(jié)尾必須加分號(hào)結(jié)束
 - 存儲(chǔ)過(guò)程的結(jié)尾使用delimiter重新設(shè)置
 
- delimiter $
 - ...
 - $
 
2.調(diào)用存儲(chǔ)過(guò)程語(yǔ)法
CALL 存儲(chǔ)過(guò)程名(參數(shù)列表)
3.創(chuàng)建和調(diào)用案例解析
①.空參數(shù)列表
- # 空參數(shù)存儲(chǔ)過(guò)程案例
 - # 創(chuàng)建存儲(chǔ)過(guò)程
 - DELIMITER $ #修改存儲(chǔ)過(guò)程的結(jié)束標(biāo)識(shí)符號(hào)
 - CREATE PROCEDURE myP1()
 - BEGIN
 - insert into demo01
 - (id,name,age,sex)
 - values
 - (10011,"jalen",27,1),
 - (10021,"xiar",26,1),
 - (10031,"heli",24,0),
 - (10041,"weiwei",28,1);
 - END $
 - DELIMITER ; #把結(jié)束標(biāo)識(shí)改回去
 - # 調(diào)用存儲(chǔ)過(guò)程
 - CALL myP1();
 - # 查看表結(jié)果
 - select * from demo01;
 
②.in模式參數(shù)的存儲(chǔ)過(guò)程
輸入單個(gè)參數(shù)的存儲(chǔ)過(guò)程
- # 2.1 in模式參數(shù)的存儲(chǔ)過(guò)程,輸入單個(gè)參數(shù)
 - # 創(chuàng)建存儲(chǔ)過(guò)程
 - DELIMITER $
 - CREATE PROCEDURE myP2(IN InName varchar(20) )
 - BEGIN
 - SELECT * from demo01 where name = InName;
 - END $
 - DELIMITER ; #把結(jié)束標(biāo)識(shí)改回去
 
- # 調(diào)用存儲(chǔ)過(guò)程
 - CALL myP2("jalen") ;
 
輸入多個(gè)個(gè)參數(shù)的存儲(chǔ)過(guò)程
- # 2.2 in模式參數(shù)的存儲(chǔ)過(guò)程,輸入多個(gè)參數(shù)
 - # 創(chuàng)建存儲(chǔ)過(guò)程
 - DELIMITER $
 - CREATE PROCEDURE myP3(IN InAge int ,IN InSex int )
 - BEGIN
 - DECLARE res varchar(20) default ""; # 申明一個(gè)局部變量res
 - SELECT name into res # 賦值
 - FROM demo01
 - WHERE age = InAge AND sex = InSex;
 - SELECT res; #使用局部變量
 - END $
 - DELIMITER ;
 
- # 調(diào)用存儲(chǔ)過(guò)程
 - CALL myP3(27,1);
 
③.out模式參數(shù)的存儲(chǔ)過(guò)程
- # 3.out模式參數(shù)的存儲(chǔ)過(guò)程
 - #創(chuàng)建存儲(chǔ)過(guò)程
 - delimiter $ #修改存儲(chǔ)過(guò)程的結(jié)束標(biāo)識(shí)
 - CREATE PROCEDURE myP4(IN name varchar(20), out age int, out sex int)
 - BEGIN
 - select
 - demo01.age,demo01.sex into age,sex
 - from
 - demo01
 - where demo01.name = name;
 - END $
 - DELIMITER ;
 
- #調(diào)用
 - CALL myP4("jalen",@age,@sex);
 - select @age,@sex;
 
④.inout模式參數(shù)的存儲(chǔ)過(guò)程
- # 4.inout模式參數(shù)的存儲(chǔ)過(guò)程
 - #創(chuàng)建存儲(chǔ)過(guò)程
 - delimiter $ #修改存儲(chǔ)過(guò)程的結(jié)束標(biāo)識(shí)
 - CREATE PROCEDURE myP5(inout m int ,inout n int)
 - BEGIN
 - set m := m+10;
 - set n := n+10;
 - END $
 - DELIMITER ;#改回原有的結(jié)束標(biāo)識(shí)分號(hào)
 
- # 調(diào)用
 - set @a := 5,@b :=10;
 - CALL myP5(@a,@b);
 - select @a,@b;
 
4.刪除存儲(chǔ)過(guò)程
- 語(yǔ)法:drop procedure 存儲(chǔ)過(guò)程名稱
 - 注意:一次只能刪除一個(gè)存儲(chǔ)過(guò)程
 - 案例:drop procedure myP1;
 
5.查看存儲(chǔ)過(guò)程的信息
- show create procedure 存儲(chǔ)名;
 




















 
 
 


 
 
 
 