2012-02-20 102 views
0

我正在循環遊標,並有標準存在的循環控制集,但在循環中,我也從另一個表中選擇,如果此搜索沒有返回任何結果,則觸發退出處理程序和循環終止。MySQL存儲過程循環控制

我的問題是:如何將循環的繼續處理程序附加到遊標並忽略select into或如何解決此問題?

DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_results=1; 
. 
. 
. 
search_loop:WHILE (no_more_results=0) DO 
. 
FETCH my_csr INTO something; 
. 
    SELECT thing INTO my_thing FROM `dups` where `dups`.thing = thing_id; 

最後選擇觸發退出條件...

感謝 保羅

+0

我無法理解繼續處理程序的文檔。 – 2012-02-20 11:42:52

回答

2

由於你的代碼是期待零個或一個行,請使用SET語法:

SET my_thing = (SELECT thing FROM dups where dups.thing = thing_id); 

如果沒有行,這將設置my_thingnull

我沒有測試過這一點,所以如果是仍然設置處理程序,改變這一點,它總是返回一行:

SET my_thing = SELECT IFNULL((SELECT thing FROM dups where dups.thing = thing_id), null); 

或者,您也同樣可以轉換您的語句:

SELECT IFNULL((SELECT thing FROM dups where dups.thing = thing_id), null) INTO my_thing; 


我相信這些替代品是按照可讀性的順序呈現的。

+0

謝謝你,第一個例子工作。所以「select into」語句只是返回與光標上的FETCH相同的「not found」錯誤代碼? – 2012-02-20 12:47:48

+0

是的 - 這是一個動態光標的簡寫版本,最多隻能接收一行。注意可能返回*多行*的條件。考慮使用'select max(thing)...'來確保最多一行。 – Bohemian 2012-02-20 13:31:42