存储过程
简单来说,存储过程(Stored Procedure)是为以后的使用而保存的一条或多条MySQL语句的集合,可以将其视为批处理,虽然其作用不仅限于批处理
使用存储过程的优点
- 把处理过程封装,简化复杂的操作
- 封装了过程,统一了输入输出,能减少使用错误
- 减少对基础数据的访问,从而减少数据讹误
- 可以编写更灵活的代码
delimiter //
一般情况下MYSQL以;结尾表示确认输入并执行语句,但在存储过程中;不是表示结束,因此可以用该命令将;号改为//表示确认输入并执行。
1、创建存储过程
delimiter //
create procedure sp_name()
begin
......
end//
delimiter ;
2、调用存储过程
call sp_name();
3、删除存储过程
drop procedure sp_name;
drop procedure if exists sp_name;
4、查看存储过程
show create procedure sp_name;
show procedure status;
5、IN、OUT、INOUT
- IN 输入参数
表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
仅需要将数据传入存储过程,并不需要返回计算后的该值。
只能当做传入参数 - OUT 输出参数
该值可在存储过程内部被改变,并可返回
不接受外部传入的数据,仅返回计算之后的值。
只能当做转出参数 - INOUT 输入输出参数
调用时指定,并且可被改变和返回
需要数据传入存储过程经过调用计算后,再传出返回值
可当做传入转出参数
# 根据员工名称查出员工所在部门名称
delimiter //
create procedure pr_dname(in empName varchar(20))
begin
select e.ename,d.dname from emp e join dept d on e.deptno=d.deptno where ename=empName;
end
//
delimiter ;
# 根据员工编号,输入的年数,查出其总共应发工资
delimiter //
create procedure pr_pay(in empno int(4), in y int(2))
begin
select e.ename,e.sal*12*y as pay from emp e where e.empno=empno;
end
//
delimiter ;
# 输入部门编号,输出部门平均工资
delimiter //
create procedure pr_avgsal(in deptno int(2),out avgsal double(7,2))
begin
select avg(e.sal) into avgsal from emp e group by e.deptno having e.deptno=deptno;
end
//
delimiter ;
call pr_avgsal(10,@avgsal);
select @avgsal;
# 输入月薪,计算年薪
delimiter //
create procedure pr_test1(inout m double(7,2))
begin
select m*12 into m;
end
//
delimiter ;
set @m=1000;
call pr_test1(@m);
select @m;
6、分支语句
delimiter //
create procedure pr_test2(in i int)
begin
select if(i>0,'windows','linux'); #if简单二分支
end
//
delimiter ;
delimiter //
create procedure pr_test3(in i int)
begin
declare j varchar(20);
# 多分支if语句
if i>0 then set j='windows';
elseif i<0 then set j='linux';
else set j='ios';
end if;
select j;
end
//
delimiter ;
delimiter //
create procedure pr_test4(in i int)
begin
declare j varchar(20);
# case等值判断
case i
when 1 then set j='windows';
when 0 then set j='ios';
else set j='linux';
end case;
select j;
end
//
delimiter ;
delimiter //
create procedure pr_test5(in i int)
begin
declare j varchar(20);
# case条件区间判断
case
when i>0 then set j='windows';
when i<0 then set j='ios';
else set j='linux';
end case;
select j;
end
//
delimiter ;
7、循环语句
mysql有3种循环语句
- while
label:while 条件 do
statements;
end while lable;
- loop
label:loop
statements;
end loop label;
- repeat
label:repeat
statements
until 结束条件;
end repeat label;
# 给dept表插入指定数目的数据
# while循环
delimiter //
create procedure pr_test12(in n int)
begin
declare i int default 1;
a:while i<=n do
insert into dept (deptno,dname,loc) values(50+i,concat('Sales',i),concat('London',i));
set i=i+1;
end while a;
end
//
delimiter ;
# 给dept表插入指定数目的数据
# loop循环,并使用leave跳出循环
delimiter //
create procedure pr_test13(in n int)
begin
declare i int default 1;
a:loop
insert into dept (deptno,dname,loc) values(50+i,concat('Sales',i),concat('London',i));
set i=i+1;
if i>n then leave a;
end if;
end loop a;
end
//
delimiter ;
# 给dept表插入指定数目的数据,但不插入5的倍数的数据
# repeat循环,iterate跳出此次执行,继续执行下一次
delimiter //
create procedure pr_test14(in n int)
begin
declare i int default 0;
a:repeat
set i=i+1;
if (i mod 5 = 0) then iterate a;
end if;
insert into dept (deptno,dname,loc) values(50+i,concat('Sales',i),concat('London',i));
until i>=n
end repeat a;
end
//
delimiter ;