delimiter ;; drop procedure if exists `proc_test` ;; CREATE PROCEDURE `proc_test`() BEGIN -- 定义变量,变量参数个数和类型和查出来的要一致 DECLARE done INT DEFAULT FALSE; DECLARE field_1 VARCHAR(20); DECLARE field_2 VARCHAR(20); -- 创建游标,并存储数据 DECLARE cur_list CURSOR FOR SELECT id, name FROM user; -- 游标中的内容执行完后将done设置为true,游标找不到下一个就会触发该语句 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true; -- 打开游标 OPEN cur_list; -- 执行循环 read_loop : LOOP -- 取游标中的值 FETCH cur_list INTO field_1, field_2; -- 判断是否结束循环,一定要放到FETCH之后,因为在fetch不到的时候才会设置done为true -- 如果放到fetch之前,先判断done,这个时候done的值还是之前的循环的值,因此就会导致循环一次 IF done THEN LEAVE read_loop; END IF; -- 执行SQL操作 SET @sql_insert = CONCAT("insert into user_bak(id, name) VALUES ('", field_1, "','", field_2 ,"')"); PREPARE sql_param FROM @sql_insert; EXECUTE sql_param ; COMMIT; END LOOP read_loop; -- 释放游标 CLOSE cur_list; END ;; delimiter;
mysql 存储过程
最新推荐文章于 2024-05-06 11:07:47 发布