18、存储过程

存储过程

简单来说,存储过程(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 ;

你可能感兴趣的:(18、存储过程)