项目需求:对表进行重新构建,这个用java的缺点是数据的传送以及遍历的话会消耗更多的资源,因此使用mysql的存储过程进行构建。

具体要求:跳过原本设置的假期和课程本身的假期对数据进行重排。

1.游标从创建到关闭的过程: 注意class_id1 的属性刚开始由declare设置的默认是空,但在打开游标之前只要给它重新赋值就不为空了。

DECLARE cc_2 CURSOR FOR SELECT id FROM pms_teach_example_day where class_id=class_id1 AND id>=(SELECT id FROM pms_teach_example_day WHERE class_id=class_id1 AND date is NULL ORDER BY id limit 1);

2.定义结束条件:02000是sql的状态码,意思是这条sql语句执行到最后了,当然在最开始的时候要定义done这个属性,默认值设为0,如果这个done属性还用在其他游标里,每次关闭游标前把done设置为0(重点),以下是定义结束条件的两种写法。

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;

3.打开游标进行循环:循环也可以有两种:一种就是repeat 另一种就是loop,loop的好处是可以控制循环何时跳出,记得打开loop要跟着跳出loop和关闭loop的结束语句,另外,在这里边虽然没有写done 的值但是它默认结束后就会给你返回1,因此在关闭游标前依旧要把done的值设为0,这个很坑,因为mysql的变量都是全局变量,一处修改下次就不能用了,所以一定要重置,cc_2可以简单理解为查询的每一行。

写法一:

OPEN cc_2;

tloop:LOOP

FETCH cc_2 INTO id2;

SET date2 = (SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(date3,',',j+1),',',-1));

IF i>j THEN

update pms_teach_example_day SET date = date2 WHERE id = id2 ;

SET j=j+1;

END IF;

IF i=j THEN

LEAVE tloop;

END if;

END LOOP tloop;

SET j =0;

SET done =0;

CLOSE cc_2;

写法二:

OPEN t_index;

REPEAT

FETCH cc_2 INTO id2;

IF done!=1 THEN

//操作语句

END IF;

UNTIL DONE END REPEAT;

CLOSE t_index;

5.嵌套循环:嵌套循环最好用游标嵌套,然后两个loop之类的,这里为了方便用了while-游标嵌套,b:BEGIN是写了一个外部的标签,因为我要循环365次,但是总不会真的要循环这么多次,当条件满足后就可以通过这个标签来进行跳出循环,跳出的语句跟loop一样:LEAVE b; 嵌套循环实现跟java一样,外部执行一次,里边要完整的循环一次,注意END LOOP 之后这个内循环就已经关闭了,END LOOP 和CLOSE cc_2之间已经不算在循环里了,所以说标红的之一段代码是外循环里的,我的外循环是用jj来进行控制,内循环的话就是自然执行完,特别注意  j  这个属性,这个属性在内循环中一直使用,因此每次外循环调用的时候要重新给它赋值,这样的话才能保证每次内循环  j   开始的值是固定的。

6.最后最后,一定要开始事务,将需要保持原子性的代码都放在一个事务里,不然你有的执行成功有的执行不成功会造成数据混乱。

6.控制循环次数时,不要用内置函数,length,replace来控制,非常消耗性能。

7.注意,当没有set的时候变量不会自己赋值,即declare 一个int 的变量时一定要初始化为0,这样才能进入循环;

8.坑:done!=1和done=1,先看两个截图:

因为第二张图的if后边没加结束的条件,所以循环到最后之后还是把i加1了,注意这个加一操作是在循环结束后加的,然后判断done=1再跳出的时候就会发现i比正常的值多1。

9.代码整理(没加事务):

mysql游标使用 loop_mysql 游标 loop while 的使用相关推荐

  1. mysql 存储过程声明式游标_Mysql 存储过程中使用游标循环读取临时表

    游标 游标(Cursor)是用于查看或者处理结果集中的数据的一种方法.游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力. 游标的使用方式 定义游标:Declare 游标名称 CURSOR ...

  2. mysql函数 游标_存储过程/游标/mysql 函数

    存储过程和函数(存储在 mysql数据库中的 proc表,所以检查有没有这个表) 存储过程是一种存储程序(如正规语言里的子程序一样),mysql支持有两种:存储过程,在其他SQL语句中可以返回值的函数 ...

  3. MySQL存储过程:利用游标+临时表实现查询

    MySQL存储过程使用游标.临时表实现动态SQL查询 2020.3.24 用能第二周周二上午,任务需求:编写存储过程查询监测设备状态以及目标监测设备状态.(任务完成) 改存储过程包含了大量相关知识,特 ...

  4. Mysql while 嵌套 cursor 游标, 数据迁移

    CREATE DEFINER=`root`@`%` PROCEDURE `removeAccPartnerSettle`() BEGIN#Routine body goes here...declar ...

  5. mysql 游标大小_Mysql游标入门

    游标 MySQL检索操作返回一组称为结果集的行.这组返回的行都是与SQL语句相匹配的行(零行或多行).使用简单的SELECT语句,例如,没有办法得到第一行.下一行或前10行,也不存在每次一行地处理所有 ...

  6. mysql 游标原理_SQL 游标原理和使用方法_MySQL

    bitsCN.com 在数据库开发过程中,当你检索的数据只是一条记录时,你所编写的事务语句代码往往使用SELECT INSERT 语句.但是我们常常会遇到这样情况,即从某一结果集中逐一地读取一条记录. ...

  7. 简述游标原理 mysql_mysql游标的原理与用法实例分析

    本文实例讲述了mysql游标的原理与用法.分享给大家供大家参考,具体如下: 本文内容: 什么是游标 创建游标 使用游标 首发日期:2018-04-18 什么是游标: 如果你前面看过mysql函数,会发 ...

  8. Oracle 11g Release 1 (11.1) 游标——显式游标

    http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/static.htm#CIHCAHJA 本文内容 声明一个游标 打开一个游标 用游标获取一个 ...

  9. oracle游标错误,ORACLE游标与错误处理

    ORACLE游标与异常处理 过程示例 create or replace procedure PROC_TASK_QUERY is g_name task_company_stock_list.g_n ...

  10. 【Oracle】PL/SQL 显式游标、隐式游标、动态游标

    在PL/SQL块中执行SELECT.INSERT.DELETE和UPDATE语句时,Oracle会在内存中为其分配上下文区(Context Area),即缓冲区.游标是指向该区的一个指针,或是命名一个 ...

最新文章

  1. DvaJS 入门, 快速上手Dva
  2. activeform表单中的旧数据怎么显示_三分钟为你细数 Vue el-form 表单校验的坑点
  3. tensorflow使用tf.placeholder会报错
  4. python 获取 特定日期 6个月前的日期_牛,复旦计算机博士小姐姐用图解Python,这也太秀了...
  5. 51单片机点亮第一个LED教程
  6. 台式电脑键盘字母乱了_电脑键盘上的一个不起眼的按键,特别实用却被粗心的人忽略...
  7. vue服务端渲染添加缓存
  8. ConcurrentHashMap 源码
  9. javascript不定参数
  10. Linux操作系统基础
  11. cocos2dx lua 升级spine兼容Spine库v3.8到最新版本
  12. Scala基础入门(二) Scala下载、安装教程
  13. 华为云启动鲲鹏计划,了解更多鲲鹏知识上华为云学院
  14. 【软件测试】:“用户登录”功能测试用例设计方法
  15. fan_in / fan_out 的理解
  16. 英特尔发布第11代核心Tiger Lake笔记本电脑处理器
  17. it转正述职报告_it转正述职报告
  18. loadimage没有与参数列表匹配的重载函数 解决方案
  19. 电仪事业部继电保护整定计算管理规定
  20. python图像灰度化_python实现图片二值化及灰度处理方式

热门文章

  1. Annotation-specified bean name ‘mapper‘ for bean class [com.thoughtworks.xstream.mapper.Mapper] conf
  2. VUE配置本地代理服务器
  3. dpl直播源_上千个高清无码直播源,爽歪歪!
  4. vs中四点画矩形的算法_实战基于图割算法的木材表面缺陷图像分析
  5. 实现对span标签的多选单选功能_如何在Notion中做多级标签?-Notion102
  6. hdu 4609 3-idiots——FFT
  7. php实现事件监听与触发的方法
  8. webform 组合查询
  9. (转)iOS Wow体验 - 第六章 - 交互模型与创新的产品概念(1)
  10. Js获取处理日期时间