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
('','张石瑞','男','',''),
('','李佛','女','',''),
('','王法无','男','','') /* 创建游标和关闭游标的四个步骤
-- 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
MySQL中 while loop repeat 的用法的更多相关文章
- MySQL 中while loop repeat 的基本用法
-- MySQL中的三中循环 while . loop .repeat 求 1-n 的和 -- 第一种 while 循环 -- 求 1-n 的和 /* while循环语法: while 条件 DO 循 ...
- mysql中isnull,ifnull,nullif的用法
今天用到了MySql里的isnull才发现他和MSSQL里的还是有点区别,现在简单总结一下: mysql中isnull,ifnull,nullif的用法如下: 1. isnull(expr) 的用法: ...
- MySQL 中now()时间戳用法
MySQL 中now()时间戳用法 UPDATE news set addtime = unix_timestamp(now()); #结果:1452001082
- mysql 中合并查询结果union用法 or、in与union all 的查询效率
mysql 中合并查询结果union用法 or.in与union all 的查询效率 (2016-05-09 11:18:23) 转载▼ 标签: mysql union or in 分类: mysql ...
- MySQL中case when的基本用法总结
MySQL中case when的基本用法总结原创Backcanhave7 最后发布于2018-12-06 15:14:15 阅读数 439 收藏展开MySQL中的case when有用两种用法,官方文 ...
- MySQL中索引和优化的用法总结
1.什么是数据库中的索引?索引有什么作用? 引入索引的目的是为了加快查询速度.如果数据量很大,大的查询要从硬盘加载数据到内存当中. 2.InnoDB中的索引原理是怎么样的? InnoDB是Mysql的 ...
- mysql中的group_concat函数的用法
本文通过实例介绍了MySQL中的group_concat函数的使用方法,比如select group_concat(name) . MySQL中group_concat函数 完整的语法如下: grou ...
- mysql中concat 和 group_concat()的用法
一.CONCAT()函数CONCAT()函数用于将多个字符串连接成一个字符串.使用数据表Info作为示例,其中SELECT id,name FROM info LIMIT 1;的返回结果为+----+ ...
- MySQL中change与modify的用法与区别
浅析MySQL中change与modify的区别 MySQL版本 show variables like 'version'; 表结构 desc student; 修改表 例如:修改表studen ...
随机推荐
- vue提示插件[vscode]
在VSCode Marketplace 搜素Vue 出现关于语法高亮的插件有 vue,vue-beautify,vue-color,VueHelper,vertur等等.比较了下载数量可以了解到,ve ...
- Log4net 单独创建配置文件(三)
1.建立ASP.Net空的Web程序,添加Default.aspx窗体 2.添加web配置文件命名为:log4net.config,添加配置 <?xml version="1.0&qu ...
- Balanced Ternary String(贪心+思维)
题目链接:Balanced Ternary String 题目大意:给一个字符串,这个字符串只由0,1,2构成,然后让替换字符,使得在替换字符次数最少的前提下,使新获得的字符串中0,1,2 这三个字符 ...
- 备份和还原 Linux 上的 SQL Server 数据库
备份数据库 在下面的示例sqlcmd连接到本地 SQL Server 实例,并采用完整备份的名为的用户数据库demodb. sqlcmd -S localhost -U SA -Q "BAC ...
- Windows 安装R
下载 R 的安装包 双击 安装包 进行安装 安装完成 测试 修改 R 中的CRAN镜像 添加到 Windows 的环境变量中 测试
- Java自己实现HTTP服务器来理解GET和POST区别
GET请求和POST请求有什么区别?GET请求的参数在URL的问号后面显示,而POST参数不在URL上:POST可以比GET请求更大的数据…一般的回答都是这样. 但是作为一个高端大气上档次的程序员 ...
- tomcat的CATALINA_HOME环境变量可以不用设置
不配置tomcat的环境变量也是可以运行的 用记事本打开tomcat/bin目录下面的startup.bat 在文本的前一部分有下面的脚本代码rem Guess CATALINA_HOME if no ...
- ggplot常见语法汇总查询
主图 散点图 柱状图 折线图 小提琴图 点图 进化树 圈图 Alluvial图 Sankey Diagram plot(getSankey(colData(muraro)$cell_type1, mu ...
- 压测引起的 nginx报错 502 no live upstreams while connecting to upstream解决
对系统的某个接口进行极限压测,随着并发量上升,nginx开始出现502 no live upstreams while connecting to upstream的报错,维持最大并发量一段时间,发现 ...
- IDS,IPS,IPD
什么是IDP - 百度文库https://wenku.baidu.com/view/c500cf35eefdc8d376ee3220.html