首頁 > 軟體

MySQL儲存過程的傳參和流程控制範例講解

2023-02-12 06:01:39

一.儲存過程傳參—in

in表示傳入的引數,可以傳入數值或者變數,即使傳入變數,並不會更改變數的值,可以內部更改,僅僅作用在函數範圍內。

 演示

use test_procedure;
-- 傳入引數in
-- 封裝有引數的儲存過程,傳入員工編號,查詢員工資訊
delimiter $$
create procedure proc6(in in_empno int)
begin
	select * from emp where emp.empno =in_empno;
end $$
delimiter ;
 
call proc6(1001);
 
 
-- 封裝有引數的儲存過程,可以通過傳入部門名和薪資,查詢指定部門,並且薪資大於指定值的員工資訊
delimiter $$
create procedure proc7(in in_dname char(50),in in_sal int)
begin
	select  * from dept,emp where dept.deptno =emp.deptno and (dept.dname=in_dname) and (in_sal<emp.sal);
end $$
delimiter ;
 
call proc7('學工部',20000);

二.儲存過程傳參—out

out表示從儲存過程內部傳值給呼叫者

 演示

-- 封裝有引數的儲存過程,傳入員工編號,返回員工名字
delimiter $$
create procedure proc8(in in_empno int,out out_ename varchar(50))
begin
	select   ename into out_ename  from emp where emp.empno =in_empno;
end $$
delimiter ;
 
call proc8(1001,@o_ename);-- 執行這一句不會輸出
select @o_ename;

-- 封裝有引數的儲存過程,傳入員工編號,返回員工名字和薪資
delimiter $$
create procedure proc9(in in_empno int,out out_ename varchar(50),out out_sal int)
begin
	select  emp.ename,emp.sal  into out_ename,out_sal from emp where emp.empno =in_empno;
end $$
delimiter ;
 
call proc9(1001,@o_ename,@o_sal);
select @o_ename,@o_sal;

 三.儲存過程傳參—inout

inout表示從外部傳入的引數經過修改後可以返回的變數,既可以使用傳入變數的值也可以修改變數的值(即使函數執行完)

 演示

-- 傳入一個數位,傳出這個數位的10倍值
delimiter $$
create procedure proc10(inout num int)
begin
	set num=num*10;
end $$
delimiter ;
 
set @inout_num=10;
call proc10(@inout_num);-- inou不可以直接傳入實參
select @inout_num;

-- 傳入員工名,拼接部門號,傳入薪資,求出年薪
-- 關羽----> 30_關羽
delimiter $$
create procedure proc11(inout inout_ename varchar(50),inout inout_sal int)
begin
	select  concat_ws('_',emp.deptno,emp.ename)  into inout_ename
	from emp
	where emp.ename =inout_ename;
	set inout_sal=inout_sal*12;
end $$
delimiter ;
 
set @ino_ename='關羽';
set @ino_sal=20000;
call proc11(@ino_ename,@ino_sal);
select @ino_ename,@ino_sal;

 四.流程控制—判斷

格式

IF語句包含多個條件判斷,根據結果為TRUE、FALSE執行語句,與程式語言中的if、else if、else語法類似,其語法格式如下:

 演示

delimiter $$
create procedure proc12(in in_score int)
begin
	
	if in_score<60
		then select '不及格';
	elseif in_score<=80
		then select '及格';
	elseif in_score<=90
		then select '良好';
	elseif in_score<=100
		then select '優秀';
	else  
		 select '成績錯誤';
	end if;
end $$
delimiter ;
 
call proc12(77);
-- 輸入員工的名字,判斷工資的情況。
/*
sal < 10000:試用薪資
sal >= 10000 and sal < 20000轉正薪資
sal >= 20000 :元老薪資
*/
delimiter $$
create procedure proc13(in in_ename varchar(50))
begin
	declare de_sal decimal(7,2);
	declare de_result varchar(50);
	select emp.sal into de_sal from emp where emp.ename =in_ename;
	if de_sal<10000
		then set de_result='試用薪資';
	elseif de_sal<20000
		then set de_result='轉正薪資';
	else
		 set de_result='元老薪資';
	end if;
	select de_sal;
end $$
delimiter ;
 
call proc13('關羽');
 
 
 
-- 這裡用使用者變數處理,就不需要先定義
delimiter $$
create procedure proc14(in in_ename varchar(50))
begin
	declare de_sal decimal(7,2);
 
	select emp.sal into @de_sal from emp where emp.ename =in_ename;
	if @de_sal<10000
		then set @de_result='試用薪資';
	elseif @de_sal<20000
		then set @de_result='轉正薪資';
	else
		 set @de_result='元老薪資';
	end if;
 
end $$
delimiter ;
 
call proc14('關羽');
select @de_sal;
 
 
 
-- 這裡是把select放在裡面
delimiter $$
create procedure proc15(in in_ename varchar(50))
begin
	declare de_sal decimal(7,2);
 
	select emp.sal into @de_sal from emp where emp.ename =in_ename;
	if @de_sal<10000
		then set @de_result='試用薪資';
	elseif @de_sal<20000
		then set @de_result='轉正薪資';
	else
		 set @de_result='元老薪資';
	end if;
	select @de_sal;
end $$
delimiter ;
 
call proc15('關羽');

 五.流程控制—case

CASE是另一個條件判斷的語句,類似於程式語言中的switch語法

語法

 演示

/*
支付方式:
1  微信支付
2  支付寶支付
3  銀行卡支付
4  其他方式支付
*/
-- 格式一
delimiter $$
create procedure proc16(in in_type int)
begin
	case in_type
		when 1 then select '微信支付';
		when 2 then select '支付寶支付';
		when 3 then select '銀行卡支付';
		when 4 then select '其他方式支付';
	end case;
end $$
delimiter ;
 
call proc16(2);
 
-- 格式二
delimiter $$
create procedure proc17(in in_type int)
begin
	case 
		when in_type=1 then select '微信支付';
		when in_type=2 then select '支付寶支付';
		when in_type=3 then select '銀行卡支付';
		when in_type=4 then select '其他方式支付';
	end case;
end $$
delimiter ;
 
call proc17(4);

 六.流程控制—迴圈

概述

  • 迴圈是一段在程式中只出現一次,但可能會連續執行多次的程式碼。
  • 迴圈中的程式碼會執行特定的次數,或者是執行到特定條件成立時結束迴圈

迴圈分類

  • while
  • repeat
  • loop

迴圈控制

  • leave類似於break,跳出,結束當前所在的迴圈
  • iterate類似於continue,繼續,結束本次迴圈,繼續下一次

迴圈—while

格式

 演示

/*
【標籤:】while迴圈條件do
	迴圈體;
end while【標籤】;
-*/
-- 需求:向表中新增指定條數的資料
-- -------儲存過程-迴圈-while
 
delimiter $$
create procedure proc18(in in_count int)
begin
	declare i int default 1;
	label:while i<=in_count do
		insert into user(id,name,password) values(i,concat('user-',i),123456);
		set i=i+1;
		if i=5 then leave label;
		end if;
	end while label;
	
end $$
delimiter ;
call proc18(10);

這裡我的理解,當要使用leave、iterate時要寫label就相當於一個名字,當然這個label可以用其他字元代替比如a,只要在使用leave、iterate時後面加上自己定義的label就行

 iterate:跳過本次迴圈的剩餘程式碼,進入下一次迴圈

迴圈—repeat

格式

演示

truncate user; 
delimiter $$
create procedure proc20(in in_count int)
begin
	declare i int default 1;
	a:repeat 
		insert into user(id,name,password) values(i,concat('user-',i),123456);
		set i=i+1;
		until i>in_count 
	end repeat;
 
	
end $$
delimiter ;
call proc20(10);

迴圈—loop

格式

 演示

 repeat和Loop區別是repeat有自己退出迴圈的語句until,Loop使用的是if判斷語句

到此這篇關於MySQL儲存過程的傳參和流程控制的文章就介紹到這了,更多相關MySQL儲存過程的傳參內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com