mysql 表结构是instid、ts、o、h、l、c、vol、confirm、k5、k10、k20、k40 现在需要用存储储存过程批量修改k5、k10、k20、k40其中k5等于前5个c得和除5k10等于前10个c得和除10k20等于前20个c得和除20k40等于前50个c得和除40表名可以动态传入
可以使用存储过程来实现批量修改k5、k10、k20、k40的功能。具体的存储过程代码如下:
DELIMITER //
CREATE PROCEDURE update_k_values(IN table_name VARCHAR(255))
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE total_rows INT;
DECLARE current_row INT DEFAULT 0;
DECLARE sum_c DECIMAL(10, 2);
DECLARE cur CURSOR FOR SELECT c FROM table_name ORDER BY ts ASC;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
SET @query = CONCAT('SELECT COUNT(*) INTO @total_rows FROM ', table_name);
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
OPEN cur;
SET current_row = 0;
SET sum_c = 0;
UPDATE table_name SET k5 = 0, k10 = 0, k20 = 0, k40 = 0;
read_loop: LOOP
FETCH cur INTO c;
IF done THEN
LEAVE read_loop;
END IF;
SET current_row = current_row + 1;
SET sum_c = sum_c + c;
IF current_row >= 5 THEN
IF current_row % 5 = 0 THEN
UPDATE table_name SET k5 = sum_c / 5 WHERE ts = current_row / 5;
END IF;
IF current_row >= 10 THEN
IF current_row % 10 = 0 THEN
UPDATE table_name SET k10 = sum_c / 10 WHERE ts = current_row / 10;
END IF;
IF current_row >= 20 THEN
IF current_row % 20 = 0 THEN
UPDATE table_name SET k20 = sum_c / 20 WHERE ts = current_row / 20;
END IF;
IF current_row >= 50 THEN
IF current_row % 50 = 0 THEN
UPDATE table_name SET k40 = sum_c / 40 WHERE ts = current_row / 40;
END IF;
END IF;
END IF;
END IF;
END IF;
END LOOP;
CLOSE cur;
END //
DELIMITER ;
通过调用存储过程update_k_values,传入表名参数table_name,即可批量修改k5、k10、k20、k40的值。例如,调用存储过程的代码如下:
CALL update_k_values('your_table_name');
其中,'your_table_name'为需要修改的表名。
原文地址: https://www.cveoy.top/t/topic/i9QH 著作权归作者所有。请勿转载和采集!