1、什么是存储过程
存储过程,带有逻辑的sql语句
2、存储过程特点
1)执行效率非常快!存储过程是在数据库的服务器端执行
2)移植性很差!不同的数据库的存储过程是不能移植的。
3、存储过程语法
-- 创建存储过程
DELIMITER $ --声明存储过程的结束符
CREATE PROCEDURE stu_test() --存储过程名称(参数列表)
BEGIN --开始
-- 可以写多个sql语句 -- sql语句+流程控制
END $ --结束 结束符
-- 执行存储过程
call stu_test() --call 存储过程名称(参数)
参数:
IN: 表示输入参数,可以携带数据带存储过程中
OUT: 表示输出参数,可以从存储过程中返回结果
INOUT: 表示输入输出参数,两者结合
4、案例
-- 存储过程
-- 1、需求:传入一个学生ID,查询该学生的信息
-- 带有输入参数的存储过程
delimiter $
create PROCEDURE stu_findByid(in sid int)
begin
select * from student where id=sid;
END $
-- 调用存储过程
call stu_findByid(1);
-- 2、带有输出参数的存储过程
delimiter $
create procedure stu_out(out str varchar(20))
begin
-- 给参数赋值
set str='这是一个输出参数';
end $
-- 删除存储过程
drop procedure stu_inout;
-- 调用存储过程
-- 1)定义了一个变量
-- 2)定义了一个会话变量接收存储过程输出的参数
call stu_out(@name);
select @name;
-- 3、输入输出参数的存储过程
delimiter $
create procedure stu_inout(inout n int)
begin
select n;
set n=500;
end $
set @n=10;
call stu_inout(@n);
select @n;
-- 4、带条件判断的存储过程
-- 需求:输入一个正整数,如果1,返回“星期一”,如果2,返回“星期二。。。。其他返回输入错误”
delimiter $
create procedure stu_testIf(in num int,out str varchar(20))
begin
if num=1 then -- 开始
set str='星期一';
elseif num=2 then
set str='星期二';
elseif num=3 then
set str='星期三';
else
set str='输入错误';
end if; -- 结束
end $
-- 执行存储过程
call stu_testIf(2,@str);
select @str;
-- 5、带循环功能的存储过程
-- 输入一个整数,求和。比如输入100,统计1-100的和
delimiter $
create procedure stu_testWhile(in num int,out result int)
begin
-- 定义两个局部变量
DECLARE i int default 1;
declare vsum int default 0;
while i<=num do
set vsum = vsum+i;
set i = i+1;
end while;
set result = vsum;
END $
call stu_testWhile(100,@result);
select @result;
drop procedure stu_testWhile;
-- 6、使用查询的结果赋值给变量(into)
delimiter $
create procedure stu_findByid2(in eid int,out vname varchar(20))
begin
select name into vname from student where id=eid;
end
call stu_findByid2(1,@vname);
select @vname;
-- 7、练习,编写一个存储过程
use students;
select * from user;
-- 如果学生的英语平均分小于等于70分,刚输出‘一般’
-- 如果学生的英语平均分大于70,且小于等于90分,刚输出‘良好’
-- 如果学生的英语平均分大于90分,刚输出‘优秀’
delimiter $
create procedure stu_testAvg(out str varchar(20))
begin
-- 计算英语平均分
declare savg double;
select avg(score) into savg from user;
if savg<=70 then
set str='一般';
elseif savg>70 and savg<=90 then
set str='良好';
else
set str='优秀';
end if;
end $
call stu_testAvg(@str);
select @str;