目錄:
一.什么是存儲過程
二.六種存儲過程
-
1.帶有輸入?yún)?shù)的存儲過程
-
2.帶有輸出參數(shù)的存儲過程
-
3.帶有輸入輸出參數(shù)的存儲過程
-
4.帶有條件判斷的存儲過程
-
5.帶有循環(huán)過程的存儲過程
-
6.使用查詢的結(jié)果作為返回值
一.什么是存儲過程
存儲過程,帶有邏輯的sql語句。(有條件判斷,可以有循環(huán)控制語句(if while)
特點:
1.執(zhí)行效率快-存儲過程是在數(shù)據(jù)庫服務器端執(zhí)行。
2.移植性差-不同數(shù)據(jù)的存儲過程是不可以移植
語法:
delimiter $ --聲明存儲過程
create procedure 名稱 --存儲過程名稱(參數(shù)列表)
begin --開始
寫sql語句; -- 多個或一個sql語句
end $ --結(jié)束 結(jié)束符
執(zhí)行存儲過程
call 名稱(); -- call 存儲過程名稱([參數(shù)])
參數(shù):
in:表示輸入?yún)?shù),可以攜帶數(shù)據(jù)帶存儲過程
out:表示輸出參數(shù),可以從存儲過程中返回結(jié)果
inout:表示輸入輸出參數(shù),既可以輸入功能,也可以輸出功能。
二.六種存儲過程
1.帶有輸入?yún)?shù)的存儲過程
--創(chuàng)建存儲過程
delimiter $
create procedure pro_findbyid(in eid int)
begin
select * from employee where id = eid;
end $
--執(zhí)行
call eurasia_echarts.pro_findbyid(1);

2.帶有輸出參數(shù)的存儲過程
如何接收返回參數(shù)的值
全局/內(nèi)置變量:
mysql數(shù)據(jù)庫內(nèi)置的變量,查看內(nèi)置變量命令show variables
mysql服務器接受數(shù)據(jù)的編碼:character_set_client
mysql服務器輸出數(shù)據(jù)的編碼:character_set_results
查看某個局部變量:select @@變量名
修改某個全局變量:set 變量名=新值
會話變量:
只存在于當前客戶端與數(shù)據(jù)庫服務器端一次連接當中。如果連接斷開,那么會話變量全部丟失
定義會話:set @變量=值
查看會話:select @變量
局部變量
在存儲過程中使用的變量就叫局部變量。只要存儲過程執(zhí)行完畢,局部變量就丟失。
--創(chuàng)建存儲過程
delimiter $
create procedure pro_out(out str varchar(20))
begin
set str ='輸出我';
end $
--執(zhí)行
set @str = '0';--(會話變量)
call eurasia_echarts.pro_out(@str);
select @str;

3.帶有輸入輸出參數(shù)的存儲過程
--創(chuàng)建存儲過程
delimiter $
create procedure pro_in_out(inout m int)
begin
select m;
set m=500;
end $
--給m賦值為10
set @m=10;
--執(zhí)行語句:結(jié)果為10
call eurasia_echarts.pro_in_out(@m);

--執(zhí)行完語句m 的值為500
select @m;

image.png
4.帶有條件判斷的存儲過程
delimiter $
delimiter $
create procedure pro_testif(in num int,out str varchar(20))
begin
if num=1 then
set str='星期一';
elseif num=2 then
set str='星期二';
elseif num=3 then
set str='星期三';
elseif num=4 then
set str='星期四';
else
set str='輸入錯誤';
end if;
end $
call eurasia_echarts.pro_testif(2,@str);
select @str;

5.帶有循環(huán)過程的存儲過程
delimiter $
create procedure pro_testwhile(in num int,out sum int)
begin
declare i int default 1;-- 定義變量
declare vsum int default 0;
while i<=num do
set vsum = vsum+i;
set i = i+1;
end while;
set sum = vsum;
end $
call eurasia_echarts.pro_testwhile(50,@sum);
select @sum;

6.使用查詢的結(jié)果作為返回值
select * from employee;

delimiter $
create procedure pro_findemployee(in eid int,out vname varchar(20))
begin
select employee.name into vname from employee where eid=id;
end $
call eurasia_echarts.pro_findemployee(1,@name);
select @name;
