一文学会:MySql存储过程

一、书面化解释

本质上就是将sql语句封装成一个方法,这个方法在sql中称为存储过程,可以把固定常用的东西放入存储过程中,但他是单独的执行单元,可以直接调用完成复杂的操作
设置临时结束符(常用于存储过程和自定义函数使用,通常修改后的结束符用在end后)

delimiter $$; -- 此处把结束符临时改为$$ 防止因为;而结束了函数
.... -- sql语句
delimiter ; -- 将临时结束符改回;

凡是有两个end的 第一个end一定是 end +执行语句头


二、存储创建和使用及删除

创建存储过程**

create procedure 存储过程名()  
begin  
-- sql语句
end;  

启动存储过程

call 存储过程名;

删除

drop procedure 存储过程名;

三、存储过程带参形式创建

create procedure 存储过程名(int|out|inout 形参名 字段类型,....)  
begin  
sql语句 -- 可以在这引用传递进来的值
end;  
  • in : 传入参数 -> 不指定则默认in
  • out:传出参数 -> 最后会返回的参数
  • inout:可以传入可以传出 -> 即既需要传入也需要传出的形参,比如传入id,返回id
    in 例子
create procedure lookName(in uid int) -- 指定uid为传传入参数  
begin  
    select username from user where id = uid;  -- 使用id = uid 来动态调用存储过程
end;

out例子

create procedure getName(in uid int ,out name varchar(10))  -- 创建一个out类型的参数
begin  
    select user.username into name from user where id = uid; -- 使用into赋值再from查表
end;

set @name=''; -- 创建用户变量,详细看总

call getName(5,@name); -- 调用过程来给@name赋值

select @name; -- 查询值,为过程查询出来的值

inout例子 -> 注意:是给需要返回和调用的参数使用

create procedure getNamePlus(inout uid int, out name varchar(10)) -- 创建存储过程
begin  
    select id , username into uid , name from user where id = uid;--复制顺序和查询顺序一致
end;

set @id = 3;   -- 创建用户变量
set @name = '';

call getNamePlus(@id,@name); -- 调用过程,结果返回id = 3 , name 为查出的name

select concat('id为',@id,'的名字是',@name); -- 展示参数

注意:select id , username into uid , name from user where id = uid;
into的前后的顺序为赋值的顺序,对应的


四、存储过程的条件

1.单分支结构 if _ then _ else _ end if,演示为id为积数就输出id,反之输出id+名字

delimiter $$  -- 修改临时结束符
create procedure ifJi(in uid int)  
begin  
    declare name varchar(10) default '';  -- 创建临时变量,便于输出
    if(uid % 2 = 0)  -- 判断
    then   -- 为真的语句块
        select id,username into uid , name from user where id = uid;  
        select concat('id为',uid,'的名字为',name);  
    else select uid;  -- 为假的语句块
    end if;  -- 结束语句
end$$  
delimiter ;  

call ifJi(6); -- 调用过程

分为以下几个步骤

  • if 判断条件
  • then 为真时的代码块
  • else 为假时的代码块
  • end if 结束语句

*2.多分支结构 if_then_elseif_else_end if ,演示:number为1输出1 为2输出2 都假就输出不为1也不为2

create procedure ifNumber(in number int)  
begin  
    if(number = 1)  
        then select concat('number为1');  
    elseif(number = 2)   -- 注意是elseif 不是else if
        then select concat('number为2');  
    else select concat('number 不为1 不为2');  
    end if;  -- end if中end和if是分开的
end;  

call ifNumber(5);

3.指定值判断,case_when_then_end case(注意是end case 和判断函数区分,判断函数是end),演示:通过查询出来的值特判内容

create procedure sexValue(inout sid int)  
begin  
    declare sexNumber int default 2;  
    select id,sex into sid,sexNumber from stu where id = sid;  -- 为演示,直接查sex值
  
    case sexNumber  
        when 1 then select concat('id为',sid,'的性别为','男');  
        when 0 then select concat('id为',sid,'的性别为','女');  
        else select concat('id为',sid,'的性别为','保密');  
    end case; -- 注意区分和判断函数的区别 判断函数是end 而 过程中的case是以end case结尾(因为有多个end,所以需要区分)  
end;  
  
set @sid = 3;  
call sexValue(@sid); -- 启动过程

五、循环语句

1.while循环 语句顺序是 while_do_end while (像java的for), 演示:循环添加数据 -

create procedure moreOfterInsert()  
begin  
    declare sid int default 1;  -- 创建变量
    while(sid <= 50)   -- 条件
        do insert into stu(name,sex) values(concat('李四',sid),1);  -- 注意do
        set sid = sid +1;  -- 改值
    end while;  -- 注意do while
end;  
call moreOfterInsert();

2.repeat循环 语句顺序是 repeat_until_end repeat (像java的while(true)) 演示:循环添加数据

create procedure repeat_insert()  
begin  
    declare sid int default 50;  
    repeat   -- 开启repete
        insert into stu(name , sex) values('小红',0);  
        set sid = sid + 1;  
    until sid > 100  -- 终止条件
        end repeat;  -- 结束
end;  
call repeat_insert();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值