Sei que você perguntou especificamente como fazer isso sem uma variável criada pelo usuário - mas para outros que se depararem com esse pensamento, valeria a pena postar como fazê-lo com um, pois é bastante simples:
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, 1);
-- ... 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
Explicação
O
@recursion_depth
variável com escopo de sessão é incrementada pelo SET
acima cada vez que o procedimento armazenado é inserido. A primeira vez que é inserida, a variável não é inicializada e, portanto, tem um valor de NULL
- isso é verificado pelo IFNULL()
, que o reatribui a um neste caso. No final do procedimento armazenado antes de sair, a profundidade precisa ser decrementada. Notas adicionais
Vale a pena notar que o SQL Server faz fornecer um
@@NESTLEVEL
embutido variável para fazer o acima - mas infelizmente o MySQL não parece ter um equivalente.