存储过程
好处:
提高代码的重用性
简化操作
减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率
存储过程含义:一组预先编译好的sql语句的集合,理解成批处理语句
1.创建语法
create procedure 存储过程名(参数列表)
begin
存储过程体(一组合法的sql语句)
end
注意:
1.参数列表包含三部分
参数模式 参数名 参数类型
参数模式:
in :该参数可以作为输入,也就是该参数需要调用方传入值
out :该参数可以作为输出,也就是该参数可以作为返回值
inout :该参数既可以作为输入又可以作为输出
2.如果存储过程体只有一句话,begin end可以省略。
存储过程体中的每条sql语句的结尾要求必须加分号。
存储过程的结尾可以使用DELIMITER重新设置
2.调用语法
call 存储过程名(实参列表);
3.空参列表
#案例:插入到admin表中五条记录 use girls; delimiter $$ create procedure myp1() begin insert into admin(username, password) values ("lili",'0000'),("yangyang",'0000'),("baoqiang",'0000'),("rose",'0000'),("tom",'0000'); end $$ delimiter ; call myp1();
4.带参数
4.1带一个参数
#案例1:创建存储过程实现根据女神名,查询对应的男生信息 delimiter $$ create procedure myp2(in beautName varchar(20)) begin select bo.* from boys bo right join beauty b on bo.id=b.boyfriend_id where b.name=beautName; end $$ delimiter ; call myp2("赵敏");
4.2带多个参数
#案例2:创建存储过程实现,用户是否登录成功 delimiter $$ create procedure myp3(in username varchar(20),in password varchar(20)) begin declare result varchar(20) default "";#声明result变量 select count(1) into result #把查询到的值赋值给result变量 from admin where admin.username=username and admin.password=password; select result; end $$ delimiter ; call myp3("lili","0000");
4.3带out的存储过程
#案例1:根据女神名,返回对应的男神名 delimiter $$ create procedure myp4(in beautyName varchar(20),out boyName varchar(20)) begin select bo.boyName into boyName from boys bo inner join beauty b on bo.id=b.boyfriend_id where b.name=beautyName; end $$ delimiter ; call myp4("小昭",@bName); select @boyName; #案例2:根据女神名,返回对应的男神名和男神魅力值 delimiter $$ create procedure myp6(in beautName varchar(20),out boyName varchar(20),out userCP int) begin select bo.boyName,bo.userCP into boyName,userCP from boys bo inner join beauty b on bo.id=b.boyfriend_id where b.name=beautName; end $$ call myp6("小昭",@bName,@userCP); select @bName; select @userCP;
4.4带inout的存储过程
#案例:传入a,b两个值,最终a和b都翻倍并返回 delimiter $$ create procedure myp8(inout a int,inout b int) begin set a=a*2; set b=b*2; end $$ delimiter ; set @m=10; set @n=20; call myp8(@m,@n); select @m,@n;
5.存储过程的删除
drop procedure myp1;
6.查看存储过程
show procedure status; desc myp2; show create procedure myp2;
7.练习
#1.创建存储过程实现传入用户名和密码,插入到admin表中 use girls; delimiter $$ create procedure test_pro(in username varchar(20),in loginPwd varchar(20)) begin insert into admin(admin.username,password) values (username,loginPwd); end $$ delimiter ; #2.创建存储过程或函数实现传入女神编号,返回女神名称和电话号码 delimiter $$ create procedure test_pro2(in id int,out name varchar(20),out phone varchar(20)) begin select b.name,b.phone into name,phone from beauty b where b.id=id; end $$ delimiter ; #3.创建存储过程或函数实现传入两个女神生日,返回大小 delimiter $$ create procedure test_pro3(in birth1 datetime,in birth2 datetime,out result int) begin select datediff(birth1,birth2) into result; end $$ call test_pro3("1989-1-1","1991-2-2") #4.创建存储过程或函数实现传入一个日期,格式化成xx年xx月xx日并返回 delimiter $$ create procedure test_pro4(in mydate datetime,out strDate varchar(50)) begin select date_format(mydate,"%y年%m月%d日") into strDate; end $$ #5.创建存储过程实现传入女神名称,返回:女神 and 男神 delimiter $$ create procedure test_pro5(in beautyName varchar(20),out str varchar(50)) begin select concat(beautyName," and ",ifnull(boyName,"null")) into str from boys bo right join beauty b on b.boyfriend_id=bo.id where b.name=beautyName; end $$ #6.创建存储过程或函数,根据传入的条目数和其实索引,查询beauty表的记录 delimiter $$ create procedure test_pro6(in startIndex int,in size int) begin select * from beauty limit startIndex,size; end $$
世界最优美的情书