2012-04-27 122 views
3

我有一個遞歸MySQL存儲過程爲我所設定的max_sp_recursion_depth=10.如何獲得mysql存儲過程遞歸的深度?

現在,沒有設置一個局部變量,我想知道的是單一的執行中有什麼遞歸的水平。

我認爲肯定有一個存儲深度的會話變量(當您達到最大級別時您還會知道什麼)但我無法找到它。我會避免使用一個變量來增量執行此操作。我怎麼知道這個(如果有的話)系統變量?

+0

你爲什麼使用遞歸?也許你可以用不同的數據結構來避免它。 – eggyal 2012-04-27 13:35:31

+2

這不是我的情況.... OT – 2012-04-27 13:41:59

+0

讓我改述一下:你爲什麼使用遞歸? SQL不打算用於這種方式。你幾乎可以肯定的避免使用不同的數據結構。 – eggyal 2012-04-27 13:47:28

回答

0

我知道你具體問如何做到這一點沒有用戶創建的變量 - 但對於其他人碰到這個即將以爲這將是值得張貼如何與一個做,因爲它是相當簡單:

CREATE PROCEDURE sp_recursive 
BEGIN 
    // ... DECLAREs here 

    -- Set maximum recursion depth (max is 255) 
    SET @@SESSION.max_sp_recursion_depth = 10; 

    -- Increment current recursion depth 
    SET @recursion_depth = IFNULL(@recursion_depth + 1, 0); 

    -- ... More stored procedure code 

    -- Decrement current recursion depth. Note: Care must be taken to ensure this line 
    -- is *always* executed at the end of the stored procedure. 
    SET @recursion_depth = @recursion_depth - 1; 
END 

說明

@recursion_depth會話範圍變量由上述SET語句中的每個被輸入該存儲的過程時間遞增。第一次輸入時,變量未初始化,所以值爲NULL - 這由IFNULL()進行檢查,在此情況下將其重新分配爲零。在退出之前的存儲過程結束時,深度需要遞減。

還注意到

值得關注的是SQL Server的做上述提供了一個內置@@NESTLEVEL變量 - 但不幸的是MySQL的似乎並不具有等同的。