使用 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 使用存储过程和游标读取并更新数据

转自:http://blog.csdn.net/rdarda/article/details/7881648 1、游标的作用及属性 游标的作用就是用于对查询数据库所返回的记录进行遍历,以便...

Oracle 中使用 fetch bulk collect into 批量效率的读取游标数据

Oracle 中使用 fetch bulk collect into 批量效率的读取游标数据 通常我们获取游标数据是用 fetch some_cursor into var1, var2 的形式...
  • xys_777
  • xys_777
  • 2011年11月10日 11:17
  • 749

Oracle 中使用 fetch bulk collect into 批量效率的读取游标数据(转载)

通常我们获取游标数据是用 fetch some_cursor into var1, var2 的形式,当游标中的记录数不多时不打紧。然而自 Oracle 8i 起,Oracle 为我们提供了 fetc...

Mysql 一条SQL语句实现批量更新数据,update结合case、when和then的使用案例

Mysql 一条SQL语句实现批量更新数据,update结合case、when和then的使用案例

fetch bulk collect into 批量效率的读取游标数据 【转载】

fetch bulk collect into 批量效率的读取游标数据 【转载】 通常我们获取游标数据是用 fetch some_cursor into var1, var2 的形式,当游标中的记录数...

使用游标批量更改表的应用

  • 2010年01月20日 17:49
  • 28KB
  • 下载

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

使用游标(cursor) 1.声明游标 DECLARE cursor_name CURSOR FOR select_statement 这个语句声明一个游标。也可以在子程序中定义多个游标,但是一个块...

MySQL批量更新不同表中的数据

今天翻到以前写的批量更新表中的数据的存储过程,故在此做一下记录。 当时MySQL中的表名具有如下特征,即根据需求将业务表类型分为了公有、私有和临时三种类型,即不同的业务对应三张表,而所做的是区分出是...

PHP如何批量更新MYSQL中的数据

最近一直忙着做公司的项目,重构完前台接着重构后台,以至于没有太多时间大理博客的内容,以后会定期更新自己的博客。        在做公司后台的时候,同事遇到了一个问题,就是产品规划里面有一个一键批量更新...

mybatis笔记-mysql批量更新数据

我们在操作一些数据的时候,可能会遇到同时改变被选中的多条数据的的某个值。接下来具体讲一下实现该操作的代码。 parameterType的值有两种情形。一种传过来的值是list,那么他的参数类型就是li...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用 mysql 游标 批量更新数据
举报原因:
原因补充:

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