存储过程/光标逻辑

时间:2014-04-30 08:55:55

标签: mysql

我设计了一个存储过程,它使用两个游标根据属于该部门的员工更新部门中的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,我会抛出一些打印语句来看看发生了什么。

1 个答案:

答案 0 :(得分:1)

我在您的存储过程中看到一些逻辑错误。这是由于cursor已完成fetch州的处理不当造成的。

正如您所提到的,它是游标的一项任务,我建议您采取一些步骤来执行所需的操作。

  1. 使用dnosalary的总和dno向员工声明游标。
  2. 打开相同的光标并循环浏览
  3. 如果不是finished那么,update deparment在单个声明中 从emp光标上方获取的值。使用dno条款中提取的where
  4. 如果已完成,则关闭emp游标
  5. 结束程序
  6. 通话程序
  7. 从部门中选择全部
         - 结果集显示:所有幸福