刚接触存储过程,现在的需求是这样的:有一个表需要我更新其中的某些字段,但是表里面的字段太多了,而且下次再更新也不确定是哪些字段要批量更新,所以就需要动态创建一个update语句来完成这个工作。
存储过程无疑是个好的选择,在mysql数据库中,所有表的字段保存在了information_schema.COLUMNS中,所以写如下存储过程解决该问题。
DROP PROCEDURE IF EXISTS test.`wk`;
DELIMITER $$
CREATE
PROCEDURE `test`.`wk`()
BEGIN
DECLARE i INT DEFAULT 0;
DECLARE c_name VARCHAR(50);
DECLARE done INT DEFAULT 0;
DECLARE update_sql VARCHAR(100) DEFAULT 'update test.tb_student set ';
DECLARE cur CURSOR FOR SELECT ifsc.COLUMN_NAME FROM information_schema.`COLUMNS` ifsc WHERE ifsc.TABLE_NAME = 'tb_student' AND ifsc.COLUMN_NAME NOT IN('id');
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
OPEN cur;
my_loop:LOOP
FETCH cur INTO c_name;
IF done=1 THEN
LEAVE my_loop;
END IF;
SET @keyvalue=CONCAT(c_name,'=NULL');
IF i <> 0 THEN
SET @keyvalue=CONCAT(',',@keyvalue);
END IF;
SET update_sql=CONCAT(update_sql,@keyvalue);
SET i=i+1;
END LOOP my_loop;
CLOSE cur;
SELECT update_sql;
END$$
DELIMITER ;