ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2021-07-22 15:34:12  阅读:175  来源: 互联网

标签:repeat varchar cur -- 游标 while MySQL 20 declare


复制代码
-- 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;

        if state then
            leave cur_loop; 
        end if; 
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

 

   

标签:repeat,varchar,cur,--,游标,while,MySQL,20,declare
来源: https://www.cnblogs.com/javalinux/p/15044335.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有