我花了很長的時間來處理這個問題:「沒有任何數據 - 零行獲取,選擇,或加工」。我意識到部分問題是不同版本的MySQL(或者Django和Python)會導致不同的行爲。我不認爲這是Python或Django特有的,但不知道。我不知道它是否與一些設置的變量有關,而不是不同版本中固有的東西。
兩組版本的有:
- SET1:(MySQL的:5.5.19),(的Python:2.7.1),(Django的:1.3.0)
- SET2:(MySQL的: 5.0.05),(Python的:2.6.8),(Django的:1.2.4)
我做什麼:
在Python(Django的通過):
cursor.execute("select function_1() from dual")
cursor.fetchall()
個
定義:
- 假人查詢指的是保證返回的行數據庫的任何查詢,但沒有在代碼邏輯的任何目的。
- continue_handler_1329 is:declare continue handler for 1329 begin end;
版本SET1
情況1A:Python會自動調用function_1其最後一查詢返回NULL。我們得到錯誤。
- 通過在末尾包含虛擬查詢(或確保最後一個查詢不返回空)來修復。
- 包含continue_handler_1329沒有效果,假設function_1沒有光標。見下文。
CASE 1b:Python調用function_1,它調用function2。沒有mysql遊標。如果函數2的LAST查詢返回空值:函數2仍然正確計算並返回適當的值給函數1。
- 無需修復。
- 包括continue_handler_1329(在任一函數中)都沒有效果(它仍然有效)。
CASE 1c:Python調用function_1,它打開一個可以調用function2的遊標(無論是在遊標循環中還是在遊標中選擇本身)。如果函數2的LAST查詢返回null:這很糟糕。光標立即關閉,function_1繼續,就像光標已經被評估過一樣。沒有警告。
- 通過包括函數2的結束虛查詢(或確保其最後一個查詢沒有返回null)固定
- 包括函數2 continue_handler_1329沒有任何效果。
- 在function_1中包含continue_handler_1329會導致無限循環。當遊標耗盡行時,遊標不會在它自己的處理程序中結束,而是在新處理程序中結束,而不是設置Done = True。
結論進行版本SET1:
- 一個虛擬的查詢再加上從Python的,以及對可能從遊標調用任何函數調用的函數。否則確保這些函數的最後一個查詢不會返回null。 continue_handler_1329不能解決問題,並會導致帶有遊標的函數出現問題(除非continue_handler_1329在自己的範圍內)。
版本SET2
殼2A:Python會自動調用function_1凡有任何查詢返回NULL。我們得到錯誤。
- 沒有虛擬查詢可以解決這個問題。
- 通過包含continue_handler_1329進行修正,假設function_1沒有任何光標(見下文)。或者確保沒有查詢返回null。
案例2b:Python調用function_1,它調用function2。沒有mysql遊標。如果function2s有ANY查詢返回null:我們得到錯誤。
- 沒有虛擬查詢可以解決這個問題。
- 通過在function2中包含continue_handler_1329(或確保沒有查詢返回null)進行修復。
- 包括功能1 continue_handler_1329沒有影響,除非它有一個光標(見下文)
框架2C:Python會調用function_1,打開一個遊標,以創建函數2(或者是光標環或 內的呼叫在光標中選擇自己)。如果函數2有ANY查詢返回null:我們得到錯誤。
- 沒有虛擬查詢可以解決這個問題。
- 通過在function2中包含continue_handler_1329(或確保沒有查詢返回null)進行修復。
- 在function_1中包含continue_handler_1329會導致無限循環。當遊標耗盡行時,遊標不會在它自己的處理程序中結束,而是在新處理程序中結束,而不是設置Done = True。
結論爲SET2
- 版本添加continue_handler_1329到可能有一個查詢返回null,與功能的異常使用遊標的任何功能。這些應該不包含任何返回null的查詢,但聲明的遊標本身除外。但是帶有遊標的函數可能包含一個帶有空返回查詢和continue_handler_1329的獨立開始結束範圍。
總之它在兩個工作:
- 添加continue_handler_1329可能含有查詢返回NULL和一個虛擬查詢添加到從Python中調用的函數,以及所有功能到可以從光標調用的任何函數。帶有遊標的函數可能不包含continue_handler_1329,也不會返回null,除非它們位於單獨的開始結束範圍內。 (遊標查詢本身可能返回null,這將由遊標的繼續處理程序處理。)。