MySQL之存储过程特殊案例
案例一:游标
BEGIN /* 定义变量 */ declare tmp0 VARCHAR(1000); declare tmp1 VARCHAR(1000); declare done int default -1; -- 用于控制循环是否结束 /* 声明游标 */ declare myCursor cursor for select id,pay_time from test_table2 limit 2; /* 当游标到达尾部时,mysql自动设置done=1 */ declare continue handler for not found set done=1; /* 打开游标 */ open myCursor; /* 循环开始 */ myLoop: LOOP /* 移动游标并赋值 */ fetch myCursor into tmp0,tmp1; /* 游标到达尾部,退出循环 */ if done = 1 then leave myLoop; end if; /* do something */ -- 循环输出信息 select tmp0,tmp1 ; -- 可以加入insert,update等语句 /* 循环结束 */ end loop myLoop; /* 关闭游标 */ close myCursor; END
案例二:数据迁移
BEGIN DECLARE t_error INTEGER DEFAULT 0; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1; # 保证数据一致性 开启事务 START TRANSACTION; # 获取需同步数据的时间节点(3个月前的第一天) # 即当前日期 2018-07-10 @upmonth 日期 2018-04-01 8 SET @upmonth = DATE_ADD(CURDATE() - DAY (CURDATE()) + 1, INTERVAL - 3 MONTH); SET @upmonth = '2019-11-14 11:05:59'; # 迁移数据语句 SET @sqlstr=CONCAT('INSERT INTO test_table2_2 SELECT * FROM test_table2_1 WHERE pay_time < ?'); # 删除数据语句 SET @delsqlstr=CONCAT('DELETE FROM test_table2_1 WHERE pay_time < ?'); #执行数据迁移 PREPARE _fddatamt FROM @sqlstr; EXECUTE _fddatamt USING @upmonth; DEALLOCATE PREPARE _fddatamt; #执行迁移后的数据删除 PREPARE _fddatadel FROM @delsqlstr; EXECUTE _fddatadel USING @upmonth; DEALLOCATE PREPARE _fddatadel; IF t_error = 1 THEN ROLLBACK; #语句异常-回滚 ELSE COMMIT; #提交事务 END IF; END
浙公网安备 33010602011771号