2010-11-05 54 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