一、存储过程使用背景
- 通过把处理封装在容易使用的单元内,简化复杂的操作
- 不需要反复建立一系列的处理步骤,可以保证数据的完整性。简化了后续人员的使用,减少了错误发生的可能性
- 简化对变动的管理。如果使用的表名,或者列名,或者其他内容发生变化,只需要更改存储过程,但是使用它的可以不用太过关注
这玩意如果不好理解的话,可以将存储过程理解成一个Java中的方法
二、创建存储过程
创建一个存储过程,用于查询工资的最小值
create procedure pro_min_salary()
begin
select min(salary) as min_salary from salaries;
end;
如果使用MySQL的命令行创建存储过程需要注意分号的处理 ;
使用call调用存储过程
call pro_min_salary();
创建存储过程还可以使用参数,比如
create procedure pro_all_salary(
out min_salary decimal(8,2),
out max_salary decimal(8,2),
out avg_salary decimal(8,2)
)
begin
select min(salary) into min_salary from salaries;
select max(salary) into max_salary from salaries;
select avg(salary) into avg_salary from salaries;
end;
每个参数必须要指定类型,这个例子中指定了三个接受参数 ,分别是最低工资 min_salary ,最高工资 max_salary,以及平均工资 avg_salary。关键字out指的是的相应的参数是从存储过程中传出的一个值,就是返回给调用者。存储过程的代码位于begin和end之间。在这里他们是一组查询语句,用于检索值保存在相应的变量中。
OUT 从存储过程中传出
IN 传递给存储过程
INOUT对存储过程传入传出
对于它调用存储过程就变成了
call pro_all_salary(@min_salary,@max_salary,@avg_salary);
这里不会有值传出,只是调用了存储过程将值存储在了各自的变量中。在MySQL中所有的变量都得以@符号开始
这是如果查看变量的话就可以看到结果了
select @max_salary;
三、查看存储过程
查询所有存储过程
show procedure status ;
如果要查询某一个存储过程的话,可以使用like
show procedure status like '%all_%';
四、删除存储过程
删除存储过程的话 drop proceduce 存储过程名
drop procedure aaa;
这样的话如果存储过程不存在的 就会报错 [42000][1305] PROCEDURE employees.aaa does not exist
所以最好写成
drop procedure if exists aaa;