缘起
因为数据库字段名字和意义被改变,里面已有数据,需要把数据修正,具体业务逻辑不再赘述,这里记录一般游标如何使用。代码意义都写在注释里面了。
-- 声明存储过程
DROP PROCEDURE IF EXISTS test1;
-- 定义 // 代替 ; 因为解释器遇到分号就会解释
-- 我们希望一个存储过程从头一直走到尾 所以用//代替;
delimiter //
CREATE PROCEDURE test1()
BEGIN
-- 声明变量
DECLARE classroomNo VARCHAR(32);
DECLARE classroomName VARCHAR(50);
DECLARE flag INT DEFAULT 0;
-- 声明游标
DECLARE classroomInfo CURSOR FOR
SELECT classroom_no,classroom_name FROM yop_classroom where classroom_name in
(SELECT classroom_no from yop_teaching_plan);
-- 游标用loop循环取值 取完最后一个再循环的时候会报错
-- 这里设置一个标志 遇到此错误退出循环
DECLARE CONTINUE HANDLER FOR NOT FOUND set flag = 1;
-- 打开游标
OPEN classroomInfo;
-- 获取结果
ci:LOOP
-- 给变量赋值 拉取游标中当前行的数据 赋值完 游标会自动指向下一行
FETCH classroomInfo INTO classroomNo,classroomName;
-- 如果flag = 1(意味着游标执行到最后一行),跳出循环
IF flag = 1 THEN
LEAVE ci;
END IF;
-- 我的业务操作
IF (classroomNo IS NOT NULL AND classroomName IS NOT NULL) THEN
UPDATE yop_teaching_plan SET classroom_no = classroomNo WHERE classroom_no = classroomName;
END IF;
END LOOP;
CLOSE classroomInfo;
END;
//
-- 把分号再替换回来
delimiter ;
-- 调用存储过程
CALL test1();
多说一句
分号替换一定要做,不然会在这一行报错
IF (classroomNo IS NOT NULL AND classroomName IS NOT NULL) THEN
报错信息:
> 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 35
> 时间: 0.012s
提示好坑爹,对于我第一次写存储过程和游标来说,这个提示简直让我疯狂。