存储过程-笔记
原博客地址:https://blog.csdn.net/kst1024/article/details/103067745
仅学习使用,不建议使用这种方法批量更新数据。原因请小伙伴们搜索一下存储过程和游标的优缺点。
DROP PROCEDURE IF EXISTS fix_receipt_time;
-- 将结束符换为//,为了避免语法错误
DELIMITER //
-- 创建存储过程
CREATE PROCEDURE fix_receipt_time()
begin
-- 定义变量
DECLARE s int DEFAULT 0;
DECLARE target_credit_record_id int(11);
DECLARE target_receipt_time TIMESTAMP;
-- 定义游标,并将sql结果集赋值到游标中
DECLARE credit_record_cursor CURSOR FOR SELECT cr.id,sr.receipt_time FROM tb_credit_record cr JOIN tb_service_record sr on sr.id = cr.service_record_id WHERE cr.receipt_time is NULL ;
-- 声明当游标遍历完后将标志变量置成某个值
DECLARE CONTINUE HANDLER FOR NOT FOUND SET s=1;
-- 打开游标
open credit_record_cursor;
-- 将游标中的值赋值给变量,注意:变量名不要和返回的列名同名,变量顺序要和sql结果列的顺序一致
fetch credit_record_cursor into target_credit_record_id,target_receipt_time;
-- 当s不等于1,也就是未遍历完时,会一直循环
while s<>1 do
-- 执行业务逻辑
UPDATE tb_credit_record SET receipt_time = target_receipt_time WHERE id = target_credit_record_id;
-- 将游标中的值再赋值给变量,供下次循环使用
fetch credit_record_cursor into target_credit_record_id,target_receipt_time;
-- 当s等于1时表明遍历以完成,退出循环
end while;
-- 关闭游标
close credit_record_cursor;
end;
//
-- 将结束符换回;
DELIMITER ;
-- 执行存储过程
call fix_receipt_time()