``` -- 使用DELIMITER改变语句结束符为//,因为存储过程内部有多条语句,需要临时改变结束符 DELIMITER // -- 创建名为increase_salary的存储过程 CREATE PROCEDURE increase_salary() BEGIN -- 定义一个变量done,用于标记游标是否已经遍历完所有符合条件的记录,初始值为FALSE DECLARE done INT DEFAULT FALSE; -- 定义一个变量emp_salary,用于存储获取到的员工工资,数据类型为 decimal,精度为10,小数位为2 DECLARE emp_salary DECIMAL(10, 2); -- 定义一个变量emp_no,用于存储获取到的员工编号,数据类型为varchar,长度为20 DECLARE emp_no VARCHAR(20); -- 定义一个游标cur,它将从employee表中选取工资在0到1000之间的员工的工资和员工编号 DECLARE cur CURSOR FOR SELECT salary, emp_no FROM employee WHERE salary BETWEEN 0 AND 1000; -- 定义一个异常处理程序,当游标遍历完所有符合条件的记录(即NOT FOUND)时,将done设置为TRUE DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- 打开游标 OPEN cur; -- 定义一个循环标签read_loop read_loop: LOOP -- 从游标中获取工资和员工编号,并分别存储到emp_salary和emp_no变量中 FETCH cur INTO emp_salary, emp_no; -- 如果done为TRUE,表示游标已经遍历完所有符合条件的记录,退出循环 IF done THEN LEAVE read_loop; END IF; -- 根据获取到的员工编号更新该员工的工资,使其上涨20% UPDATE employee SET salary = salary * 1.2 WHERE emp_no = emp_no; END LOOP; -- 关闭游标 CLOSE cur; END // -- 将语句结束符恢复为默认的; DELIMITER ;
CREATE PROCEDURE add_salary(IN num1 INT,IN num2 INT) BEGIN DECLARE ids INT; DECLARE sal INT; DECLARE add_sal INT; DECLARE yy INT DEFAULT 0; DECLARE salary_csr CURSOR FOR SELECT id,salary FROM em_salary WHERE salary BETWEEN num1 AND num2; DECLARE CONTINUE HANDLER FOR NOT found SET yy = 1; OPEN salary_csr; WHILE yy != 1 DO FETCH salary_csr INTO ids,sal; SET add_sal= sal+sal*0.2; UPDATE em_salary SET salary = add_sal WHERE id = ids; END WHILE; CLOSE salary_csr;