MySQL存储过程的传参和流程控制示例讲解

2023年 4月 15日 12.0k 0

目录 一.存储过程传参in 演示 二.存储过程传参out 三.存储过程传参inout 四.流程控制判断 格式 五.流程控制case 语法 六.流程控制循环 循环while 循环repeat 循环loop 一.存储过程传参in in表示

目录一.存储过程传参—in 演示二.存储过程传参—out 三.存储过程传参—inout 四.流程控制—判断格式 五.流程控制—case语法 六.流程控制—循环循环—while循环—repeat循环—loop

一.存储过程传参—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);

 六.流程控制—循环

概述

循环是一段在程序中只出现一次,但可能会连续运行多次的代码。循环中的代码会运行特定的次数,或者是运行到特定条件成立时结束循环

循环分类

whilerepeatloop

循环控制

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存储过程的传参内容请搜索每日运维以前的文章或继续浏览下面的相关文章希望大家以后多多支持每日运维!

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论