目錄:
一.什么是存儲過程
二.六種存儲過程
-
1.帶有輸入參數的存儲過程
-
2.帶有輸出參數的存儲過程
-
3.帶有輸入輸出參數的存儲過程
-
4.帶有條件判斷的存儲過程
-
5.帶有循環過程的存儲過程
-
6.使用查詢的結果作為返回值
一.什么是存儲過程
存儲過程,帶有邏輯的sql語句。(有條件判斷,可以有循環控制語句(if while)
特點:
1.執行效率快-存儲過程是在數據庫服務器端執行。
2.移植性差-不同數據的存儲過程是不可以移植
語法:
delimiter $
--聲明存儲過程
create procedure 名稱
--存儲過程名稱(參數列表)
begin
--開始
寫sql語句;
-- 多個或一個sql語句
end $
--結束 結束符
執行存儲過程
call 名稱();
-- call 存儲過程名稱([參數])
參數:
in:表示輸入參數,可以攜帶數據帶存儲過程
out:表示輸出參數,可以從存儲過程中返回結果
inout:表示輸入輸出參數,既可以輸入功能,也可以輸出功能。
二.六種存儲過程
1.帶有輸入參數的存儲過程
--創建存儲過程
delimiter $
create procedure pro_findbyid(in eid int)
begin
select * from employee where id = eid;
end $
--執行
call eurasia_echarts.pro_findbyid(1);
2.帶有輸出參數的存儲過程
如何接收返回參數的值
全局/內置變量:
mysql數據庫內置的變量,查看內置變量命令show variables
mysql服務器接受數據的編碼:character_set_client
mysql服務器輸出數據的編碼:character_set_results
查看某個局部變量:select @@變量名
修改某個全局變量:set 變量名=新值
會話變量:
只存在于當前客戶端與數據庫服務器端一次連接當中。如果連接斷開,那么會話變量全部丟失
定義會話:set @變量=值
查看會話:select @變量
局部變量
在存儲過程中使用的變量就叫局部變量。只要存儲過程執行完畢,局部變量就丟失。
--創建存儲過程
delimiter $
create procedure pro_out(out str varchar(20))
begin
set str ='輸出我';
end $
--執行
set @str = '0';--(會話變量)
call eurasia_echarts.pro_out(@str);
select @str;
3.帶有輸入輸出參數的存儲過程
--創建存儲過程
delimiter $
create procedure pro_in_out(inout m int)
begin
select m;
set m=500;
end $
--給m賦值為10
set @m=10;
--執行語句:結果為10
call eurasia_echarts.pro_in_out(@m);
--執行完語句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.帶有循環過程的存儲過程
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.使用查詢的結果作為返回值
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;