美文网首页
Mysql存储过程的陷阱

Mysql存储过程的陷阱

作者: lz做过前端 | 来源:发表于2021-09-29 10:52 被阅读0次

    1. 变量的使用

    1.1. 变量的定义

    -- 示例
    declare declare1 binary(16);
    
    • 游标接收的变量定义在循环之外
    • 如果没有必要不要使用session级的变量(@XXX)
      • 该变量直到断开连接,否则一旦赋值一直存在
      • 如果是常量可以考虑使用
    • 根据游标每一次循环接收的变量而生成或者获取的变量定义在循环内部所在的begin end块中
      • begin end相当于一个作用域,定义在作用域内的变量相当于该作用域内的局部变量,定义在作用域外的相当于全局变量
      • 如果是定义在作用域之外的变量,如果下一次的循环没有走到变量重新赋值的地方,就会有问题

    1.2. 变量的赋值

    • set
      • 如果使用 select 进行变量的set赋值,则如果 count > 1,程序直接退出,并且不会报错
      • 如果 count = 0,则正常执行,此时变量为null
    -- 示例
    set declare1 = (select id from table1 where column1 = 'xxx' order by column2 desc limit 1);
    
    • select into
      • 如果 count > 1,程序直接退出,并且不会报错
      • 如果 count = 0,并且处于循环,则跳出当前循环
    -- 示例
    select column1, column2, column3 into declare1, declare2, declare3 from table1 where column4 = 'xxx';
    select column1, column2, column3 from table1 where column4 = 'xxx' into declare1, declare2, declare3;
    
    • 总结
      • 无论 set 还是 select into 都需要确保查询结果唯一,而 set 允许查询结果为空, select into 不允许
      • 使用 order by + limit 1 是一个粗糙的解决方式,等于你在忽略其余的数据

    2. begin end

    • 利用 begin end 可以实现游标循环的嵌套
    • 使用了 if else 语句时,最好一上来就用 begin end,虽然一个语句也可以不使用 begin end,但是保不齐后续会增加逻辑。对于多条语句该条件下只会执行第一个语句,后续的语句的执行与 if 条件无关

    相关文章

      网友评论

          本文标题:Mysql存储过程的陷阱

          本文链接:https://www.haomeiwen.com/subject/sgfjnltx.html