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;