mysql 存储过程批量更新

最近做一个批量更新的操作,由于是临时需求,就想着在数据库直接操作,不在代码里动手了,结合网上的一些资料,做如下处理:

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();

你可能感兴趣的:(mysql 存储过程批量更新)