• MySQL 中的三中循环 while loop repeat 的基本用法


    复制代码
    -- MySQL中的三中循环 while 、 loop 、repeat  求  1-n 的和
    

    -- 第一种 while 循环
    --
    求 1-n 的和
    /
    while循环语法:
    while 条件 DO
    循环体;
    end while;
    /
    -- 实例:
    create procedure sum1(a int)
    begin
    declare sum int default 0; -- default 是指定该变量的默认值
    declare i int default 1;
    while i<=a DO -- 循环开始
    set sum=sum+i;
    set i=i+1;
    end while; -- 循环结束
    select sum; -- 输出结果
    end
    -- 执行存储过程
    call sum1(100);
    -- 删除存储过程
    drop procedure if exists sum1

    -- 第二种 loop 循环
    /
    loop 循环语法:
    loop_name:loop
    if 条件 THEN -- 满足条件时离开循环
    leave loop_name; -- 和 break 差不多都是结束训话
    end if;
    end loop;
    /

    -- 实例:
    create procedure sum2(a int)
    begin
    declare sum int default 0;
    declare i int default 1;
    loop_name:loop
    -- 循环开始
    if i>a then
    leave loop_name;
    -- 判断条件成立则结束循环 好比java中的 boeak
    end if;
    set sum=sum+i;
    set i=i+1;
    end loop; -- 循环结束
    select sum; -- 输出结果
    end
    -- 执行存储过程
    call sum2(100);
    -- 删除存储过程
    drop procedure if exists sum2

    -- 第三种 repeat 循环
    /
    repeat 循环语法
    repeat
    循环体
    until 条件 end repeat;
    /

    -- 实例;
    create procedure sum3(a int)
    begin
    declare sum int default 0;
    declare i int default 1;
    repeat
    -- 循环开始
    set sum=sum+i;
    set i=i+1;
    until i
    >a end repeat; -- 循环结束
    select sum; -- 输出结果
    end

    -- 执行存储过程
    call sum3(100);
    -- 删除存储过程
    drop procedure if exists sum3

    复制代码

    存储过程加游标一起使用的基本操作

    复制代码
    -- 存储过程  加  游标
    

    -- 建表
    create table student(
    sid
    varchar(8) primary key,
    sname
    varchar(10),
    sex
    varchar(2),
    age
    int,
    classno
    varchar(6)
    );
    -- 表中的数据
    insert into student values
    (
    '20170101','张石瑞','','19','201701'),
    (
    '20170201','李佛','','20','201702'),
    (
    '20170202','王法无','','19','201702')

    / 创建游标和关闭游标的四个步骤
    -- 1、创建游标 (cur_name 游标名字)
    declare cur_name cursor for select 语句;
    -- 2、打开游标
    open cur_name;
    -- 3、提取游标数据
    fetch cur_name [into 变量1,变量2,、、、、、];
    -- 4、关闭(释放)游标
    close cur_name;
    /
    -- 游标的基本提取操作
    create PROCEDURE proc1()
    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 from student;
    -- 2、
    open student_cur1;
    -- 3、
    fetch student_cur1 into cur_sid,cur_sname,cur_sex,cur_age,cur_classno;
    select cur_sid,cur_sname,cur_sex,cur_age,cur_classno;
    -- 4、
    close student_cur1;
    END

    -- 执行存储过程
    call proc1();
    -- 删除存储过程
    drop procedure if exists proc1

    -- 游标的循环遍历‘
    create PROCEDURE proc2()
    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
    select sid,sname,sex,age,classno from student;
    -- 2、
    open student_cur1;
    -- 3、 最简单的 while 遍历方法
    select count(sid) into sum from student;
    while i<sum DO
    fetch student_cur1 into cur_sid,cur_sname,cur_sex,cur_age,cur_classno;
    select cur_sid,cur_sname,cur_sex,cur_age,cur_classno;
    set i=i+1;
    end while;
    -- 4、
    close student_cur1;
    END

    -- 执行存储过程
    call proc2();
    -- 删除存储过程
    drop procedure if exists proc2

    -- 使用 loop 遍历游标
    create PROCEDURE proc3()
    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 from student;
    -- 2、
    open student_cur1;
    -- 3、 loop 遍历游标
    cur_loop:loop -- 循环开始
    --
    循环开始的时候提取一次
    fetch student_cur1 into cur_sid,cur_sname,cur_sex,cur_age,cur_classno;
    select cur_sid,cur_sname,cur_sex,cur_age,cur_classno;

        </span><span style="color: #0000ff;">if</span> state <span style="color: #0000ff;">then</span><span style="color: #000000;">
            leave cur_loop; 
        </span><span style="color: #0000ff;">end</span> <span style="color: #0000ff;">if</span><span style="color: #000000;">; 
    

    end loop; -- 循环结束
    --
    4、
    close student_cur1;
    END

    -- 执行存储过程
    call proc3()
    -- 删除存储过程
    drop procedure if exists proc3

    /*
    fetch是获取游标当前指向的数据行,并将指针指向下一行,当游标已经指向最后一行时继续执行会造成游标溢出。
    使用loop循环游标时,他本身是不会监控是否到最后一条数据了,像下面代码这种写法,就会造成死循环;

    read_loop:loop
    fetch cur into n,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 CONTINUE HANDLER FOR SQLSTATE '02000' set done = true;
    所以在循环时加上了下面这句代码:

    --判断游标的循环是否结束
    if done then
    leave read_loop; --跳出游标循环
    end if;
    如果done的值是true,就结束循环。继续执行下面的代码。

    */

    -- 性别翻转

    create PROCEDURE proc4()
    BEGIN
    declare cur_sid int;
    declare cur_sex varchar(1);

    declare state int default false;
    -- 1、
    declare sex_cur cursor for select sid,sex from student;
    --
    declare CONTINUE HANDLER for not found set state=true;
    -- 2、
    open sex_cur;
    -- 3、
    sex_loop:LOOP -- 循环开始
    fetch sex_cur into cur_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、
    close sex_cur;
    END

    -- 执行存储过程
    call proc4()
    -- 删除存储过程
    drop procedure if exists proc4

    -- 表的查询
    select * from student

    复制代码

    http://www.cnblogs.com/Lvhengshuai/category/997161.html

  • 相关阅读:
    codeforces 132C Logo Turtle(dp)
    LCIS 最长公共上升子序列
    欧拉函数与欧拉定理
    HDU 5592 ZYB's Premutation(树状数组+二分)
    HDU 4294 Multiple(搜索+数学)
    1080 Graduate Admission (30分)(排序)
    1078 Hashing (25分)(欧拉筛素数打表 + hash平方探测)
    1074 Reversing Linked List (25分)(链表区间反转)
    1099 Build A Binary Search Tree (30分)(BST的层序或者中序遍历建树,层序便利输出树)
    1068 Find More Coins (30分)(记忆化搜索 || dp)
  • 原文地址:https://www.cnblogs.com/jpfss/p/9604165.html
Copyright © 2020-2023  润新知