INSERT INTO ON DUPLICATE KEY UPDATE 用法

来源:互联网 发布:mac格式化u盘就剩200m 编辑:程序博客网 时间:2024/04/25 02:28
DELIMITER $$DROP PROCEDURE IF EXISTS `SP_BACK_MANAGE_EAT`$$CREATE PROCEDURE `SP_BACK_MANAGE_EAT`(IN p_drawdateId BIGINT, IN p_gameId INT)proc:    BEGINDECLARE _number VARCHAR(4);DECLARE _big DECIMAL(13,6);DECLARE _small  DECIMAL(13,6);DECLARE _stockMaxPrize DECIMAL(20,6);DECLARE _weekDay INT;DECLARE _number_game_draw VARCHAR(20);DECLARE _firstBigPrize DECIMAL(13,6);DECLARE _firstSmlPrize DECIMAL(13,6);DECLARE _eatBig DECIMAL(13,6);DECLARE _eatSml DECIMAL(13,6)DECLARE _maxBig DECIMAL(13,6);DECLARE _maxSmall DECIMAL(13,6);DECLARE _putBig DECIMAL(13,6);DECLARE _putSml DECIMAL(13,6);DECLARE done, error BOOLEAN DEFAULT FALSE;DECLARE i INT;DECLARE _values MEDIUMTEXT;DECLARE c CURSOR FOR    SELECT number,SUM(big) big,SUM(small) small FROM TB_BACK_EAT  WHERE game_id=p_gameId AND drawDate_id=p_drawdateId AND STATUS=0  GROUP BY number;DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET error = TRUE,done=TRUE;DECLARE CONTINUE HANDLER FOR 1329 SET done = TRUE; SELECT stock_max_prize,week_day INTO _stockMaxPrize,_weekDay FROM TB_BACK_DRAW_DATE WHERE id = p_drawdateId;SELECT first_big,first_sml INTO _firstBigPrize,_firstSmlPrize FROM TB_BACK_GAME WHERE id=p_gameId;SET _maxBig = _stockMaxPrize/_firstBigPrize;SET _maxSmall = _stockMaxPrize/_firstSmlPrize;OPEN c;   IF error THEN        SELECT error;      LEAVE proc;    END IF;  SET autocommit=0; SET i=0;UPDATE TB_BACK_EAT_REPORT SET fromBig=0,fromSml=0,big=0,small=0,putBig=0,putSml=0 WHERE gameId=p_gameId AND drawDateId=p_drawDateId;REPEAT  FETCH c INTO _number,_big,_small;  IF NOT done THEN   IF _big>=_maxBig THEN SET _eatBig = _maxBig;SET _eatSml = 0;   ELSESET _eatBig = _big;SET _maxSmall = FLOOR((_stockMaxPrize - _big*_firstBigPrize)/_firstSmlPrize);IF _small>=_maxSmall THEN   SET _eatSml = _maxSmall;ELSE   SET _eatSml = _small;END IF;   END IF;   SET _putBig = _big - _eatBig;   SET _putSml = _small-_eatSml;   SET _number_game_draw = CONCAT(_number,'_',p_gameId,'_',p_drawDateId);    IF i=0 THEN   SET _values = CONCAT('(',p_gameId,',',p_drawDateId,',',_weekDay,',\'',_number,'\',',_big,',',_small,',',_eatBig,',',_eatSml,',',_putBig,',',_putSml,',',0,',',0,',\'',_number_game_draw,'\')');   ELSESET _values = CONCAT(_values,',','(',p_gameId,',',p_drawDateId,',',1,',\'',_number,'\',',_big,',',_small,',',_eatBig,',',_eatSml,',',_putBig,',',_putSml,',',0,',',0,',\'',_number_game_draw,'\')');   END IF;  SET i=i+1; END IF;UNTIL done END REPEAT;CLOSE c;SET @sqltext=CONCAT('INSERT INTO TB_BACK_EAT_REPORT(gameId, drawDateId,WEEKDAY,number,fromBig,fromSml,big,small,putBig,putSml,outBig,outSml,num_game_draw) VALUES',_values,'ON DUPLICATE KEY      UPDATE fromBig=VALUES(fromBig),fromSml=VALUES(fromSml),big=VALUES(big),small=VALUES(small),putBig=VALUES(putBig),putSml=VALUES(putSml);');PREPARE stmt FROM @sqltext;EXECUTE stmt;DEALLOCATE PREPARE stmt;COMMIT;SELECT error;    END$$DELIMITER ;