2011-08-12 130 views
1

所以我有一個名爲open_loop的遊標執行查詢,現在我想循環它,檢查它所保存的值是否存在於數據庫中,如果有的話,我需要更新該條目,如果不是插入它。MySQL存儲過程循環問題

的問題是,我退出循環的方法是等待狀態02000是:Success, but no rows found。不幸的是,如果用戶表中沒有條目,也會發生這種情況,所以循環會被切斷!我怎樣才能使它不觸發該事件,但如果loop_cur用完了條目,或者可能找到退出循環的另一種方式,仍會觸發?

我的代碼是在這裏:

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1; 
OPEN loop_cur; 

REPEAT 

    FETCH loop_cur 
    INTO user_id, user_info 

    SELECT Id INTO user_id FROM users WHERE Id = user_id; 

    IF user_id IS NOT NULL THEN 

     UPDATE users 
     SET info = user_info 
     WHERE Id = user_id; 

    ELSE 
     INSERT INTO users (user_info); 
    END IF; 
    UNTIL done END REPEAT; 
CLOSE loop_cur; 

請不,這是簡化了,因爲我真的插入和獲取更多的價值,併爲loop_cur查詢被相當複雜的,所以我不包括,但它確實有效。

最後,我不能使用INSERT對重複密鑰更新,是什麼我檢查是不是一個真正的user_ID的,這是一個不同的專欄中,我使用的user_id爲簡單起見。

回答

0

使用在循環內設置爲true的布爾變量。

無關的代碼簡明,刪除:

DECLARE found boolean default false; 

... 

REPEAT 

    FETCH loop_cur ... 

    SET found = true; 

    ... 

UNTIL done END REPEAT; 

-- found is now true if you got some rows, false otherwise 
+0

我覺得你有種錯誤理解時,我想退出,我以爲你的意思是直到顯示找到,但我認爲我得到了它的要點和實施類似的東西哪些工作。謝謝! –