最近做一个批量更新的操作,由于是临时需求,就想着在数据库直接操作,不在代码里动手了,结合网上的一些资料,做如下处理:
1.先建立一个临时表,导入需要变动的数据;
DROP TABLE IF EXISTS t_barcode;
CREATE TABLE `t_barcode` (
`barCode` varchar(32) DEFAULT NULL,
`quantity` double DEFAULT NULL COMMENT '修改数量'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Procedure structure for my_batch_update
-- ----------------------------
2.建立存储过程,从游标当中取临时表的数据,逐一调用更新的存储过程
DROP PROCEDURE IF EXISTS `my_batch_update`;
DELIMITER ;;
CREATE PROCEDURE `my_batch_update`()
BEGIN
DECLARE
nodata INT DEFAULT 0 ; #注意:这个变量声明必须放在游标声明前面
DECLARE
barCode VARCHAR (20) ;
DECLARE
quantity DOUBLE ;
DECLARE -- 1、定义一个游标mycursor
mycursor CURSOR FOR
SELECT
tb.barCode barCode,
tb.quantity
FROM
t_barcode tb ;
DECLARE EXIT HANDLER FOR NOT FOUND
SET nodata = 1 ; -- 当读到数据的最后一条时,设置变量为1 DECLARE CONTINUE HANDLER FOR NOTFOUND
OPEN mycursor ; -- 2、打开游标
WHILE nodata = 0 DO -- 3 判断是不是到了最后一条数据
-- 4、使用游标获取列的值
FETCH next FROM mycursor INTO barCode,quantity ; -- 4、显示结果
CALL my_batch_upadae_stock (barCode,quantity) ;
END WHILE ;
-- 5、关闭游标
CLOSE mycursor ;
END
;;
DELIMITER ;
3.建立更新的存储过程
-- ----------------------------
-- Procedure structure for my_batch_upadae_stock
-- ----------------------------
DROP PROCEDURE IF EXISTS `my_batch_upadae_stock`;
DELIMITER ;;
CREATE PROCEDURE `my_batch_upadae_stock`(IN barCode VARCHAR(30),IN quantity DOUBLE)
BEGIN
UPDATE t_repertory_detail SET quantity = quantity WHERE bar_code =barCode;
UPDATE t_transitbox_last_record SET quantity=quantity WHERE bar_code =barCode;
END
;;
DELIMITER ;
4.调用过程
CALL my_batch_update();