Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como obter profundidade na recursão do procedimento de armazenamento do mysql?


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.