使用 mysql 游标 批量更新数据

原创 2016年08月31日 13:58:32

游标由于安全性问题,感觉用到的地方还是比较少,这里由于测试数据需要批量更新用到了,所以就mark一下。

本次使用游标目的是:遍历数据表,同时更新DATETIME类型的字段为某范围内随机时间。

首先是生成范围内随机日期的sql:

SELECT CONCAT(FLOOR(1980 + (RAND() * 35)),'-',LPAD(FLOOR(1 + (RAND() * 12)),2,0),'-',LPAD(FLOOR(3 + (RAND() * 8)),2,0));


然后是生成随机时间的sql:

SELECT CONCAT(LPAD(FLOOR(0 + (RAND() * 23)),2,0),':',LPAD(FLOOR(0 + (RAND() * 59)),2,0),':',LPAD(FLOOR(0 + (RAND() * 59)),2,0));

日期和时间拼起来,就可以赋值了,下面是存储过程:

DELIMITER $$

DROP PROCEDURE IF EXISTS `time_cursor`;
CREATE PROCEDURE `time_cursor` ()
BEGIN
	DECLARE tcomdate,tjoindate,tquitdate,tbirthdate,tstartdate,tenddate DATETIME;
	DECLARE tempno VARCHAR(10);
	DECLARE done INT DEFAULT 0;
	DECLARE cur CURSOR FOR SELECT empno FROM t_personsales;
	
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
	
	OPEN cur;
	FETCH cur INTO tempno;
	REPEAT
		IF NOT done THEN
			SELECT CONCAT(FLOOR(1990 + (RAND() * 25)),'-',LPAD(FLOOR(1 + (RAND() * 12)),2,0),'-',LPAD(FLOOR(3 + (RAND() * 8)),2,0),' ',LPAD(FLOOR(0 + (RAND() * 23)),2,0),':',LPAD(FLOOR(0 + (RAND() * 59)),2,0),':',LPAD(FLOOR(0 + (RAND() * 59)),2,0)) INTO tcomdate;
			SELECT CONCAT(FLOOR(2000 + (RAND() * 15)),'-',LPAD(FLOOR(1 + (RAND() * 12)),2,0),'-',LPAD(FLOOR(3 + (RAND() * 8)),2,0),' ',LPAD(FLOOR(0 + (RAND() * 23)),2,0),':',LPAD(FLOOR(0 + (RAND() * 59)),2,0),':',LPAD(FLOOR(0 + (RAND() * 59)),2,0)) INTO tjoindate;
			SELECT CONCAT(FLOOR(2010 + (RAND() * 6)),'-',LPAD(FLOOR(1 + (RAND() * 12)),2,0),'-',LPAD(FLOOR(3 + (RAND() * 8)),2,0),' ',LPAD(FLOOR(0 + (RAND() * 23)),2,0),':',LPAD(FLOOR(0 + (RAND() * 59)),2,0),':',LPAD(FLOOR(0 + (RAND() * 59)),2,0)) INTO tquitdate;
			SELECT CONCAT(FLOOR(1960 + (RAND() * 40)),'-',LPAD(FLOOR(1 + (RAND() * 12)),2,0),'-',LPAD(FLOOR(3 + (RAND() * 8)),2,0),' ',LPAD(FLOOR(0 + (RAND() * 23)),2,0),':',LPAD(FLOOR(0 + (RAND() * 59)),2,0),':',LPAD(FLOOR(0 + (RAND() * 59)),2,0)) INTO tbirthdate;
			SELECT CONCAT(FLOOR(1999 + (RAND() * 10)),'-',LPAD(FLOOR(1 + (RAND() * 12)),2,0),'-',LPAD(FLOOR(3 + (RAND() * 8)),2,0),' ',LPAD(FLOOR(0 + (RAND() * 23)),2,0),':',LPAD(FLOOR(0 + (RAND() * 59)),2,0),':',LPAD(FLOOR(0 + (RAND() * 59)),2,0)) INTO tstartdate;
			SELECT CONCAT(FLOOR(1999 + (RAND() * 15)),'-',LPAD(FLOOR(1 + (RAND() * 12)),2,0),'-',LPAD(FLOOR(3 + (RAND() * 8)),2,0),' ',LPAD(FLOOR(0 + (RAND() * 23)),2,0),':',LPAD(FLOOR(0 + (RAND() * 59)),2,0),':',LPAD(FLOOR(0 + (RAND() * 59)),2,0)) INTO tenddate;
			UPDATE t_personsales SET COMDATE = tcomdate,JOINDATE = tjoindate,QUITDATE = tquitdate,BIRTHDATE = tbirthdate,CHK_START_DATE = tstartdate, CHK_END_DATE = tenddate where empno = tempno;
		END IF;
	FETCH cur INTO tempno;
	UNTIL done = 1
	END REPEAT;
	CLOSE cur;
END

然后 call time_cursor(); 大功告成。


版权声明:本文为博主原创文章,未经博主允许不得转载。

mysql游标示例 mysql游标简易教程 mysql批量操作数据 mysql批量更新数据 mysql逐条更新数据

从mysql V5.5开始,进行了一次大的改变,就是将InnoDB作为默认的存储引擎。InnoDB支持事务,而且拥有相关的RDBMS特性:ACID事务支持,数据完整性(支持外键),灾难恢复能力等等。 ...
  • likingsn
  • likingsn
  • 2014年12月10日 11:24
  • 1801

使用游标批量更新数据

 -- 定义游标MyTestCursor:declare  MyTestCursor cursorfor select id,updatetime from tb_topic /*从表中选取两个字段*...
  • vipxiaotian
  • vipxiaotian
  • 2007年08月24日 00:49
  • 800

Mysql存储过程(二):循环,游标,更新,参数输出y

drop procedure if exists hagonda_insert; create procedure hagonda_insert() begin declare b int ...
  • xb12369
  • xb12369
  • 2015年03月02日 14:53
  • 6791

Oracle使用游标更新数据

使用游标修改数据定义一个游标,游标名称为 mycursor更新scott用户中emp表中empno为7369的销售额-- Created on 2015/11/30 by ZHANW declare...
  • hzwy23
  • hzwy23
  • 2016年11月20日 13:15
  • 3328

oracle 使用游标批量分段插入数据

By Mark RittmanUsing Bulk Binds And FORALLYesterday, I looked at collections, an evolution of PL/SQ...
  • aoyo
  • aoyo
  • 2008年06月19日 14:14
  • 2910

MySql中游标的定义与使用方式

创建游标 首先在MySql中创建一张数据表: CREATE TABLE IF NOT EXISTS `store` ( `id` int(11) NOT NULL AUTO_INCREMENT, ...
  • liguo9860
  • liguo9860
  • 2016年03月10日 18:42
  • 26678

Sql Server 游标(利用游标逐行更新数据)、存储过程

游标中用到的函数,就是前一篇文章中创建的那个函数。 另外,为了方便使用,把游标放在存储过程中,这样就可以方便地直接使用存储过程来执行游标了。 1 create procedure Upd...
  • chihen
  • chihen
  • 2014年10月23日 16:11
  • 4571

mysql中游标的使用案例详解(学习笔记)

1.游标是啥玩意? 简单的说:游标(cursor)就是游动的标识,啥意思呢,通俗的这么说,一条sql取出对应n条结果资源的接口/句柄,就是游标,沿着游标可以一次取出一行。我给大家准备一张图: ...
  • xushouwei
  • xushouwei
  • 2016年08月13日 20:20
  • 13429

Mysql创建存储过程,使用游标Cursor循环更新

使用游标(cursor) 1.声明游标 DECLARE cursor_name CURSOR FOR select_statement 这个语句声明一个游标。也可以在子程序中定义多个游标,但是一个块...
  • fengshizty
  • fengshizty
  • 2014年01月13日 11:02
  • 6823

mysql大批量更新数据

大批量的更新数据如果再使用传统的(update)方法一条一条的更新,效率是很慢的,而且性能差,也很容易造成阻塞。这里给大家分享两种方法:1:使用mysql 自有的语句构建批量更新 UPDATE tb...
  • zl570932980
  • zl570932980
  • 2017年05月18日 15:04
  • 789
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用 mysql 游标 批量更新数据
举报原因:
原因补充:

(最多只允许输入30个字)