美文网首页我爱编程
7.1 存储过程加游标的基本操作

7.1 存储过程加游标的基本操作

作者: 沈婷_bbf1 | 来源:发表于2018-05-25 20:58 被阅读21次

    游标基本提取操作

    create PROCEDUREproc1()

    BEGIN

    declare cur_sid varchar(20);

    declare cur_sname varchar(20);

    declare cur_sex varchar(20);

    declare cur_age varchar(20);

    declare cur_classno varchar(20);

    -- 1、

    declare student_cur1 CURSOR for

    select sid,sname,sex,age,classno fromstudent;

    -- 2、

    openstudent_cur1;

    -- 3、

    fetch student_cur1 intocur_sid,cur_sname,cur_sex,cur_age,cur_classno;

    selectcur_sid,cur_sname,cur_sex,cur_age,cur_classno;

    -- 4、

    closestudent_cur1;

    END

    返回结果是


    Student表格是下面这样的


    Do  while遍历游标

    create PROCEDUREproc2()

    BEGIN

    declare cur_sid varchar(20);

    declare cur_sname varchar(20);

    declare cur_sex varchar(20);

    declare cur_age varchar(20);

    declare cur_classno varchar(20);

    declare sum int default 0;

    declare i int default 0;

    -- 1、

    declare student_cur1 CURSOR for

    selectsid,sname,sex,age,classno fromstudent;

    -- 2、

    openstudent_cur1;

    -- 3、 最简单的  while遍历方法

    select count(sid) into sum fromstudent;

    while i

        fetch student_cur1 intocur_sid,cur_sname,cur_sex,cur_age,cur_classno;

        selectcur_sid,cur_sname,cur_sex,cur_age,cur_classno;

        set i=i+1;

    end while;

    -- 4、

    closestudent_cur1;

    END

    结果如下(这个结果我有点怀疑,本来应该要全部呈现数据的吧?)

    结果全部返回表中的数据,只是自己没有注意到。有1结果,2结果,3结果


    -- 使用 loop 遍历游标

    create PROCEDUREproc3()

    BEGIN

    declare cur_sid varchar(20);

    declare cur_sname varchar(20);

    declare cur_sex varchar(20);

    declare cur_age varchar(20);

    declare cur_classno varchar(20);

    declare state int default false; -- 定义表示用于判断游标是否溢出

    -- 1、

    declare student_cur1 CURSOR for

    select sid,sname,sex,age,classno fromstudent;

    -- 2、

    openstudent_cur1;

    -- 3、 loop 遍历游标

    cur_loop:loop -- 循环开始

    -- 循环开始的时候提取一次

     fetch student_cur1 intocur_sid,cur_sname,cur_sex,cur_age,cur_classno;

     selectcur_sid,cur_sname,cur_sex,cur_age,cur_classno;

      if state then leave cur_loop;

     end if;

    end loop; -- 循环结束

    -- 4、

    closestudent_cur1;

    END

    返回结果和do while 循环遍历一样。

    *

    fetch是获取游标当前指向的数据行,并将指针指向下一行,当游标已经指向最后一行时继续执行会造成游标溢出。

    使用loop循环游标时,他本身是不会监控是否到最后一条数据了,像下面代码这种写法,就会造成死循环;

    read_loop:loop 

    fetch cur inton,c; 

    set total =total+c; 

    end loop; 

    在MySql中,造成游标溢出时会引发mysql预定义的NOT FOUND错误,所以在上面使用下面的代码指定了当引发not found错误时定义一个continue 的事件,指定这个事件发生时修改done变量的值。

    declare continue

    HANDLER(连续操作) for not found set done = true; 

    也有这样写的

    DECLARE CONTINUEHANDLER FOR SQLSTATE '02000' set done = true;

    所以在循环时加上了下面这句代码:

    --判断游标的循环是否结束 

    if done then 

        leave read_loop;    --跳出游标循环 

    end if; 

    如果done的值是true,就结束循环。继续执行下面的代码。

    */

    -- 性别翻转

    create PROCEDUREproc4()

    BEGIN

    declare cur_sid int;

    declare cur_sex varchar(1);

    declare state int defaultfalse;

    -- 1、

    declare sex_cur cursor for select sid,sex fromstudent;

    declare CONTINUE HANDLER for not found set state=true;(可删掉)

    -- 2、

    opensex_cur;

    -- 3、

    sex_loop:LOOP -- 循环开始

        fetch sex_cur intocur_sid,cur_sex;

            if state then

                leave sex_loop;

            end if;

            if cur_sex='男' then

                update student set sex='女' where sid=cur_sid;

            end if;

            if cur_sex='女' then

                update student set sex='男' where sid=cur_sid;

            end if;

    end loop; -- 循环结束

    -- 4、

    closesex_cur;

    END

    相关文章

      网友评论

        本文标题:7.1 存储过程加游标的基本操作

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