首页 > 试题广场 >

写一个存储过程,使employee(name,age,emp

[问答题]
写一个存储过程,使employee(name,age,emp_no,salary)表中的salary值在0-1000之间的员工的工资上涨20%,(提示:要求用到游标)
``` -- 使用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 ;
编辑于 2024-10-24 18:38:10 回复(0)
用了自己的表
DROP PROCEDURE IF EXISTS add_salary;
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;

END;

发表于 2021-05-18 14:18:19 回复(0)