2010-11-05 142 views
0

我正在尝试编写一个sql语句,它将插入给定几个设置变量的数据。我不想创建存储过程,因为除了作为管理员,我不会在任何地方处理这些存储过程,并且我不希望存储过程四处闲逛。我只想要一个有效的声明。这是我到目前为止有:如何在MySQL语句中使用嵌套循环和变量

SET @app = 7; 
SET @time = UNIX_TIMESTAMP(NOW()); 
SET @maxValue = 100; 
SET @decrement = 10; 
SET @category = 1; 
SET @minSubcategory = 0; 
SET @maxSubcategory = 19; 
SET @subcategory = @minSubcategory; 
subcat_loop: LOOP 
    SET @idx = 0; 
    insert_loop: LOOP 
    SET @id = CONCAT('TempId', @idx+1); 
    SELECT @name:=username FROM user WHERE id = @id; 
    SET @value = @maxValue - @decrement * @idx; 
    INSERT INTO data (userId, username, app, category, subcategory, value, date) VALUES 
     (@id, @name, @app, @category, @subcategory, @value, @time); 
    SET @idx = @idx+ 1; 
    IF @idx > 10 THEN 
     LEAVE insert_loop; 
    END IF; 
    END LOOP insert_loop; 
    SET @subcategory = @subcategory + 1; 
    IF @subcategory > @maxSubcategory THEN 
    LEAVE subcat_loop; 
    END IF; 
END LOOP subcat_loop; 

但它不喜欢的循环出于某种原因里面SET @idx = 0。我究竟做错了什么?

请注意,这可能是我第一次尝试做这些与MySQL复杂的事情,而我的小知识可能比完全不知道的更危险,所以让我知道如果我以错误的方式去做完全(虽然我真的,真的不希望为此存储过程)。

回答

3

不幸的是,你不能在存储程序之外使用LOOP:存储过程,存储函数和触发器。

你有一些选择:

  1. 您可以创建一个存储过程,并限制权限,以便其他用户无法执行它。
  2. 另一种选择是在脚本中临时创建一个存储过程,运行它,然后将其放在脚本的末尾。

否则,如果您仍然不想创建存储过程,最好的办法是在shell,python等编写一个小脚本来完成循环。

祝你好运!

+0

谢谢,我很害怕这个。 – 2010-11-05 16:36:46