我设计了一个存储过程,它使用两个游标根据属于该部门的员工更新部门中的total_sal列。
我没有得到正确的结果,我相信我可能对存储过程和游标的流程有错误的想法。
我试图用来实现这个目标的逻辑:
1- open Cursor迭代部门
2-在部门的每一行获得部门编号
3- open Cursor迭代员工
每个员工4-如果员工部门编号等于部门光标中的部门编号,我们将他们的工资添加到total_sum 在员工表耗尽后5-我们最终用total_sum更新了部门的total_salary
6 - 在第2步重启
这是存储过程:
CREATE PROCEDURE updateSalary()
BEGIN
DECLARE emp_sal, eDno, dDno INT;
DECLARE total_sum INT DEFAULT 0;
DECLARE finished INT DEFAULT 0;
DECLARE dep_cursor CURSOR FOR SELECT Dno FROM Department;
DECLARE emp_cursor CURSOR FOR SELECT Dno, Salary FROM Employee;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;
open dep_cursor;
department_loop: LOOP
FETCH dep_cursor INTO dDno;
IF finished = 1 THEN
LEAVE department_loop;
END IF;
open emp_cursor;
employee_loop: LOOP
FETCH emp_cursor INTO eDno, emp_sal;
IF eDno = dDno THEN
SET total_sum = total_sum + emp_sal;
END IF;
IF finished = 1 THEN
update department SET total_sal = total_sum WHERE department.dno = dDno;
LEAVE employee_loop;
END IF;
SET total_sum = 0;
END LOOP employee_loop;
close emp_cursor;
END LOOP department_loop;
CLOSE dep_cursor;
END;
/
以下是我一直在使用的SQLFiddle,http://sqlfiddle.com/#!2/b9cc2f/1/1
我对调试MySQL不是很熟悉,如果这是Java,我会抛出一些打印语句来看看发生了什么。
答案 0 :(得分:1)
我在您的存储过程中看到一些逻辑错误。这是由于cursor
已完成fetch
州的处理不当造成的。
正如您所提到的,它是游标的一项任务,我建议您采取一些步骤来执行所需的操作。
dno
并salary
的总和dno
向员工声明游标。finished
那么,update deparment
在单个声明中
从emp光标上方获取的值。使用dno
条款中提取的where
。