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;

原文地址:https://www.cnblogs.com/wjgbok/p/10796754.html