mysql之存储过程

存储过程和函数

存储过程

一组预先编译号的sql语句的集合,理解成批处理语句
类似于java中的方法:
1.提高代码的重用性,
2.简化操作。
3.减少了编译次数和数据库服务器的连接次数,提高了效率。

创建

create or replace procedure 存储过程的名字(参数列表)
begin
 存储过程体(一组合法的sql语句)
end

1.注意:参数列表包含三部分:参数的模式,参数名,参数类型
举例:in stuname varchar(20)

参数模式:
in:该参数可以作为输入,也就是该参数需要调用方传入值
out:该参数可以作为输出,也就是该参数可以作为返回值
inout:该参数既可以作为输入又可以作为输出,也就是该参数既需要传入值,又可以返回值。

2.如果存储过程中仅仅只有一句话,begin end 可以省略。
存储过程中的每条sql的结尾要求必须加分号。
存储过程中的结尾可以使用DELIMITER重新设置
语法:
DELIMITER 结束标记。

调用

Call 存储过程名(实参列表);

案例

  1. 不带参数的存储过程
delimiter $
create procedure mypl1()
begin
    insert into admin(username, password)
    values ('john1', '0000'),
           ('john2', '0000'),
           ('john3', '0000'),
           ('john4', '0000'),
           ('john5', '0000');
end $

call mypl1();

2.带in模式参数的存储过程

delimiter $
create procedure myp2(in beautyName varchar(20))
begin
    select *
    from boys bs
             right join beauty b on bs.id = b.boyfriend_id
    where b.name = beautyName;

end $

call myp2('柳岩');

delimiter $
create  procedure myp3(in username varchar(20),in password varchar(20))
begin
    declare ret varchar(20) default '';# 声明变量
    select count(1) into ret
    from admin a
        where a.username=username
    and a.password=password;

    select ret;
end $

call myp3('john1','0000');

3.带out模式参数的用法

delimiter $
create procedure myp5(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 $

call myp5('小昭',@bName);
select @bName;
delimiter $
create procedure myp6(in beautyName varchar(20),out boyName varchar(20),out userCp int)
begin
    select bs.boyName,bs.userCP into boyName,userCp from boys bs
    left join beauty bty on bs.id=bty.boyfriend_id
    where bty.name=beautyName;

end $
set @empname = '小昭';
call myp6(@empname,@bName,@userCp);

select @bName,@userCp;

4.创建带inout模式参数的存储过程
1.案例1:传入a和b两个值,最终a和b都翻倍并返回。

delimiter $
create procedure myp8(inout a int,inout b int)
begin
    set a=a*2;
    set b=b*2;
end $

set @m=20;
set @n=30;

call myp8(@m,@n);

select @m,@n;
-- 传入用户名和密码,插入到admin表中
delimiter $
create procedure test_pro1(in userName varchar(20),in passwor varchar(20))
begin
    insert into admin(userName,password) value (userName,passwor);
    commit;
end $

call test_pro1('admin','00000');

-- 传入女神编号,返回女神名称和女生电话
delimiter $
create procedure test_pro2(in bid int,out bname varchar(20),out bphone varchar(20))
begin
    select name,phone into bname,bphone from beauty b where b.id=bid;
end $

call test_pro2(1,@name,@phone);

select @name,@phone;

-- 传入两个女神生日,返回大小
delimiter $
create procedure test_pro3(in birthDay datetime,in birthDay2 datetime,out ret int)
begin
    select datediff(birthDay,birthDay2) into ret;
end $

call test_pro3('1998-1-1','1999-1-1',@ret);

select @ret;

删除存储过程

语法: drop produce 存储过程的名称

drop procedure test_pro2;

查看存储过程

show create procedure test_pro3;
posted @ 2022-03-09 01:19  King-DA  阅读(194)  评论(0)    收藏  举报