• Mysql 学习笔记07


    Mysql 的游标

        游标的声明

         declare + 游标名称 + cursor + for + selec语句

    open +游标名称

       fetch

    close + 游标名称

    游标取值越界时,有没有标识?利用标识来结束?

         在mysql 的游标中 可以 使用 declare continue handler 来操作1个越界标识

        declare  continue handler for not found statement;o

    create procedure p15()

    begin

       declare row_gid int;

        declare row_num int;

        declare row_name varchar(20);

        declare you int default 1;

       declare getgoods cursor for select gid,num,name from goods;

       declare continue handler for not found set you :=0;

     open getgoods;

         repeat

             fetch getgoods into row_gid,row_num,row_name;

             select row_num,row_name;

       until you = 0  end repeat;

    close getgoods;

    end;

    上面的p15()是存在逻辑错误的。它会把最后一条数据取两遍,因为是用来 continuce handler for 在  满足 for not found 条件后,还是会继续执行下去, 修改方式了使用 exit handler 代替。

     exit 与 continue的区别是 exit 触发后,后面的语句就不在执行了。

          

    create procedure p16()

      begin

          declare row_gid int;

          declare row_num int;

          declare row_name varchar(20);

          declare you int default 1;

         declare getgoods cursor for select gid,num,name from goods;

         declare exit handler for not found set you :=0;

       open getgoods;

         repeat

             fetch getgoods into row_gid,row_num,row_name;

             select row_num,row_name;

       until you = 0  end repeat;

    close getgoods;

    end;

    ------ 除 continue ,exit 外 还有一种 undo handler,

            continue 是触发后,后面的语句继续执行。

            exit 是触发后,后面的语句不在执行,

            undo 是触发后,前面的语句撤销,目前mysql  还不支持。

    上面的 p16()还是存在问题的,因为表中可能不存在数据,就没办法去fetch 数据。

    改进方案,P17()

       create procedure p17()

        begin

          declare row_gid int;

          declare row_num int;

          declare row_name varchar(20);

          declare you int default 1;

         declare getgoods cursor for select gid,num,name from goods;

         declare continue handler for not found set you :=0; // 这里还使用 continue

       open getgoods;

        //  在这里先fetch 一下,如果没有数据那么 repeat 就不会执行了

      fetch getgoods into row_gid,row_num,row_name;

      repeat

             fetch getgoods into row_gid,row_num,row_name;

             select row_num,row_name;

       until you = 0  end repeat;

    close getgoods;

    end;

  • 相关阅读:
    阻止事件传播的常用方法
    原生JS获取元素的位置与尺寸
    FileReader 与canvas结合使用显示图片
    dot.js使用心得
    时间格式转换
    JS对象操作
    vue-awesome-swipe 基于vue使用的轮播组件 使用(改)
    vscode 插件推荐
    chrome 发送请求出现:Provisional headers are shown 提示
    手机端
  • 原文地址:https://www.cnblogs.com/wjgbok/p/10796754.html
Copyright © 2020-2023  润新知