存储过程

好处:
  提高代码的重用性
  简化操作
  减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率

存储过程含义:一组预先编译好的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();
View Code

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("赵敏");
View Code

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");
View Code

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;
View Code

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;
View Code

5.存储过程的删除

drop procedure myp1;
View Code

6.查看存储过程

show procedure status;
desc myp2;
show create procedure myp2;
View Code

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 $$
View Code

 

posted @ 2019-11-16 15:22  徐大  阅读(452)  评论(0编辑  收藏  举报