Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie erhält man Tiefe in der Rekursion der MySQL-Speicherprozedur?

Ich weiß, dass Sie ausdrücklich gefragt haben, wie man das ohne macht eine vom Benutzer erstellte Variable - aber für andere, die auf diesen Gedanken stoßen, wäre es wert, zu posten, wie man es mit macht one, da es ziemlich einfach ist:

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

Erklärung

Der @recursion_depth Session-Scope-Variable wird durch das obige SET inkrementiert -Anweisung jedes Mal, wenn die gespeicherte Prozedur eingegeben wird. Bei der ersten Eingabe ist die Variable nicht initialisiert und hat daher den Wert NULL - Dies wird von IFNULL() überprüft , die es in diesem Fall einem zuweist. Am Ende der gespeicherten Prozedur, kurz vor dem Beenden, muss die Tiefe dekrementiert werden.

Weitere Hinweise

Erwähnenswert ist, dass SQL Server das tut Stellen Sie einen eingebauten @@NESTLEVEL bereit Variable, um das obige zu tun - aber leider scheint MySQL kein Äquivalent zu haben.