2012-05-16 17 views
2

我正試圖在光標的循環內調用MySQL中的存儲過程。在循環中執行INSERT時,遊標的行爲正確;但如果我嘗試調用存儲過程,則繼續處理程序'設置完成= 1',並且將在處理第一條記錄後過早退出循環。有關如何解決此問題的任何想法?謝謝。在光標循環中調用存儲過程,不跳閘繼續處理程序

declare test_cursor cursor for 
     select projectid, projectdesc 
     from tblProjects 
     order by projectdesc;   

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

set done = 0; 
open test_cursor; 

repeat 

    fetch test_cursor into wprojectid, wprojectdesc; 

    if not done then 

    insert into tblTest (a, b) values (wprojectid, wprojectdesc); <--this would work 
    call spTest(wprojectid, wprojectdesc, @retrn);         <--this trips the Handler after first loop 

    end if;  

until done end repeat; 

close test_cursor; 

回答

2

我不確定,但嘗試看看這段代碼是否工作?

declare test_cursor cursor for 
     select projectid, projectdesc 
     from tblProjects 
     order by projectdesc;   

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; 
DECLARE done_holder INT; 


set done = 0; 
open test_cursor; 

repeat 

    fetch trade_cursor into wprojectid, wprojectdesc; 

    if not done then 

    set done_holder = done; 
    insert into tblTest (a, b) values wprojectid, wprojectdesc; 
    call spTest(a, b, @retrn); 
    set done = done_holder; 

    end if;  

until done end repeat; 

close test_cursor; 
+0

這很接近,這種方法是類似的,但比我的「設置完成= 0」後更優雅的力量調用sp後。仍然在這裏結束。謝謝。 – user1399233

+1

是的,這是正確的解決方案 - 問題是,當「調用spTest ...」函數運行時,它有時會跳出「完成」標誌。我有時通過調用函數來設置變量值。因此,在調用函數之前,將「完成」的值存儲到臨時持有者中,並在調用糾正問題後立即將該值加載回「完成」。謝謝Ehsan。 – user1399233

+0

謝謝@ user1399233!我無法理解爲什麼它在第一次循環後跳閘。 +1。 – Kit

0

我認爲這個問題是在這裏 - '叫spTest(A,B,@retrn);',嘗試用這個來改變它 -

CALL spTest(wprojectid, wprojectdesc, @retrn); 

所以,你的代碼可以像這是 -

DECLARE done INT DEFAULT 0; 
    DECLARE wprojectid, wprojectdesc INT; 
    DECLARE test_cursor CURSOR FOR SELECT projectid, projectdesc FROM tblProjects ORDER BY projectdesc; 
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; 

    SET done = 0; 
    OPEN test_cursor; 

    REPEAT 
    FETCH test_cursor INTO wprojectid, wprojectdesc; 
    IF NOT done THEN 
     INSERT INTO tblTest (a, b) VALUES (wprojectid, wprojectdesc); 
     CALL spTest(wprojectid, wprojectdesc, @retrn); 
    END IF; 
    UNTIL done 
    END REPEAT; 
    CLOSE test_cursor; 
+0

不,問題不是傳遞給sp的參數(即sp的語法),問題是調用sp將繼續處理程序'done'設置爲1,並且退出循環。 – user1399233

+0

奇怪。我已經測試過,它的工作原理。嘗試調試代碼,可能還有其他錯誤問題。 [用於MySQL的調試器](http://www.devart.com/dbforge/mysql/studio/code-debugger.html)您可以使用試用版。 – Devart

+0

我認爲問題實際上是當我將NULL作爲IN參數之一傳遞給storedproc時,底層​​INSERT由於NOT NULL約束而異常終止,並且sp從REPEAT循環中跳出。所以我看到的問題並不真實。我會繼續我的測試。非常感謝。 – user1399233