剛接觸存儲過程,現在的需求是這樣的:有一個表需要我更新其中的某些字段,但是表裏面的字段太多了,而且下次再更新也不確定是哪些字段要批量更新,所以就需要動態創建一個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 ;