无法在MySQL中使用WHILE LOOP

时间:2013-09-10 15:41:54

标签: mysql loops while-loop

我是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;

1 个答案:

答案 0 :(得分:1)

您可以使用代码改进许多内容:

  1. 第一行需要以CREATE PROCEDURE
  2. 开头
  3. 您没有包含DELIMITER语句,因此它不会按原样运行。也许你在其他地方设置了分隔符?如果没有,你需要一个。
  4. 要了解基本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. 如果您需要为每个部门设置一个结果集,请考虑使用cursors
    4. 您的最终SET行不应该在1周围加引号,因为您希望将其视为整数。在这种情况下,它有效,但这是一个不好的习惯。
    5. 回到存储过程,我建议您花一些时间浏览http://dev.mysql.com/doc/refman/5.6/en/create-procedure.html上的官方语法文档,其中包含许多权威形式的文档。