存储过程
一组预先编译好的 SQL 语句的集合,可以理解成批处理语句。作用:
- 提高代码的重用性
- 简化操作
- 减少编译次数、减少了和数据库服务器的连接次数,提高效率
创建
create procedure 存储过程名(参数列表)
begin
存储过程体(一组合法的 SQL 语句)
end
- 参数列表:
参数模式
参数名
参数类型
参数模式:
in
:该参数需要输入(默认)out
:该参数可以输出inout
:既需要传入值,又可以输出
- 如果存储过程体中只有一条 SQL 语句,
begin
end
可以省略 - 存储过程体中每条 SQL 语句的结尾要加分号
;
delimiter
可以设置存储过程的结尾
delimiter 结束标志;
调用
call 存储过程名(实参列表);
无参数存储过程
drop procedure myp1;
delimiter $
create procedure myp1()
begin
select * from `Reader`;
end $
call myp1(); -- 调用存储过程
in 参数存储过程
- 存储过程的形参是局部变量,能在函数内部直接使用
drop procedure myp1;
delimiter $
create procedure myp1(in gender varchar(2))
begin
select * from `Reader`
where sex = gender; -- 直接使用形参
end $
call myp1('男');
eg:查看用户是否登陆成功
create procedure myp3(in `username` varchar(20), in `password` varchar(20))
begin
declare result int default 0; -- 声明并初始化局部变量
select count(*) into result -- 给局部变量赋值
from admin
where admin.`username`=`username`
and admin.`passowrd`=`password`;
select if(result>0, '成功', '失败');
end $
call myp3('张飞', '123');
out 参数存储过程
out
后面的形参会自动返回给实参- 实参是用户变量,不用显示声明,可以直接使用
eg:根据读者名字,返回借阅数量
drop procedure if exists myp2;
delimiter $
create procedure myp2(in Name varchar(20), out borrowCount varchar(20))
begin
select count(*) into borrowCount -- 给形参赋值
from reader r
inner join borrow b
on b.readerNo = r.readerNo
where readerName = Name;
end $
call myp2('张良', @count); -- 调用存储过程
select @count; -- 输出实参
inout 参数存储过程
eg:传入 a 和 b 两个值,最终 a 和 b 都翻倍并返回
drop procedure if exists myp3;
delimiter $
create procedure myp3(inout a int, inout b int)
begin
set a = a * 2; -- 给局部变量赋值
set b = b * 2;
end $
set @m = 10; -- 声明并初始化用户变量
set @n = 20;
call myp3(@m, @n); -- 调用存储过程
select @m, @n; -- 20 40
删除
drop procedure [if exists] 存储过程名;
每次只能删除一个存储过程
查看
show create procedure 存储过程名;
用于查看存储过程的具体信息
函数 & 存储过程
- 存储过程:0 ~ n 个返回值 → 适合做批量插入,批量更新
- 函数:有且仅有 1 个返回值 → 适合处理数据后返回一个结果