gpt4 book ai didi

mysql - 存储过程/游标逻辑

转载 作者:行者123 更新时间:2023-11-29 13:00:42 24 4
gpt4 key购买 nike

我设计了一个存储过程,它使用两个游标根据属于该部门的员工更新部门中的total_sal 列。

我没有得到正确的结果,我相信我对存储过程和游标的流程可能有错误的想法。

我试图用来完成此任务的逻辑:

1-打开光标遍历部门

2-在部门的每一行获取部门编号

3-打开光标迭代员工

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,我只会输入一些打印语句来看看发生了什么。

最佳答案

我在您的存储过程中发现一些逻辑错误。这是由于对cursor完成fetch状态处理不当造成的。

正如您所提到的,这是对游标的赋值,我建议您遵循一些步骤来执行所需的操作。

  1. 使用 dno 声明员工游标以及按 dno 分组的 salary 总和。
  2. 打开同一个光标并循环
  3. 如果没有完成,则在单个语句中更新部门从上面的 emp 游标获取的值。使用在 where 子句中获取的 dno
  4. 如果完成则关闭 emp 光标
  5. 结束程序
  6. 调用过程
  7. 选择部门中的所有内容
    -- 结果集显示:皆大欢喜

关于mysql - 存储过程/游标逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23383772/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com