-2

我是 Mysql 循环的新手,网上似乎没有太多关于它们的信息。我已经搜索过了,但什么也做不了。有人可以帮忙吗,这是代码

PROCEDURE while_loop()
  BEGIN

    SET @var_number_of_departments = (SELECT COUNT(DISTINCT departmentid) FROM employees); -- finds number of departments
    SET @var_departmentid = 1; -- sets incrementing value to 1

    WHILE @var_number_of_departments > @var_departmentid DO -- loop until all departments have been analyzed                            

      SELECT Name FROM employees WHERE BossID IS NULL AND departmentid =  @var_departmentid AND salary > (SELECT salary     FROM employees WHERE bossID IS NOT NULL    AND DepartmentID = @var_departmentid);

      SET @var_departmentid = @var_departmentid + '1'; -- increment value in order to analyze the next department

    end while;                           
end;
4

1 回答 1

1

您可以使用代码改进许多方面:

  1. 第一行需要以CREATE PROCEDURE
  2. 您不包含DELIMITER语句,因此它不会按原样运行。也许您在其他地方设置了分隔符?如果没有,您将需要一个。

要查看基本WHILE循环如何运行,下面是一个不使用任何 SQL 表查询的简单示例:

DELIMITER //
CREATE PROCEDURE basic_while()
BEGIN
   SET @stopval := 5;
   SET @counter := 1;
   WHILE @counter <= @stopval DO
      SELECT @counter;
      SET @counter := @counter + 1;
   END WHILE;
END//
DELIMITER ;

注意DELIMITER和 这个词的使用CREATE

更进一步,一些额外的点可能有助于解决这个特定问题。

  1. 部门 ID 的循环假定您的部门 ID 在一个基于 1 的连续单调递增集中。这是一个很大的假设。考虑一下如果部门 ID 从 1001 开始,或者如果部门 4 合并为 6,因此您的部门是 1、2、3、5、6、7,会发生什么情况。部门 7 永远不会被计算在内。
  2. 您可以在单个查询(使用嵌套子查询)中解决此问题,这将为您提供包含所有结果的单个结果集,而不是每个部门的结果集。
  3. 如果您需要每个部门有一个结果集,请考虑使用游标
  4. 你的最后SET一行不应该有引号1,因为你想把它当作一个整数。在这种情况下,它可以工作,但这是一个坏习惯。

回到存储过程,我建议您花一些时间阅读http://dev.mysql.com/doc/refman/5.6/en/create-procedure.html上的官方语法文档,其中包含很多这是权威的形式。

于 2013-09-10T16:16:33.200 回答