With recursive ist das einzige SQL-Konstrukt, das nicht zwangsläufig irgendwann fertig wird.0 Da das DBMS meist ein sehr wichtiges System ist, müssen Endlosschleifen dort immer vermieden werden. Daher bietet der SQL-Standard eine eigene Funktion dafür an: Die Cycle-Klausel. Bei manchen rekursiven Abfragen kann man Endlosschleifen mittels union [distinct] in der Rekursion unterbinden. Zu guter Letzt gibt es auch Systeme, die die Ausführungsanzahl des rekursiven Zweiges limitieren. Die meisten dieser Systeme bieten auch eine Möglichkeit an, dieses Limit anzupassen oder gar aufzuheben.
- Verwende
Cycle … Restrict• KeineUsing …Sub-Klausel - Keine
Using …Sub-Klausel - Konfigurierbar
- Falsch-positive Warnung möglich
Einstellung des Limits
Einige der Systeme, die die Ausführung bei Überschreitung eines Schwellwerts abbrechen, bieten eine Möglichkeit diesen Schwellwert zu ändern oder gar aufzuheben.
- Verwende 0, um das Limit vollständig aufzuheben
Die folgenden Beispiele zeigen die jeweilige Syntax, um das Limit auf den Maximalwert zu setzen. Die ersten beiden Varianten werden der jeweiligen SQL-Anweisung hinzugefügt.
WITH … ()
SELECT …
OPTION (maxrecursion 0)WITH … ()
SELECT /*+ SET_VAR(cte_max_recursion_depth = 4294967295) */ …Die nächsten ändern den Schwellwert für die aktuelle Session. Diese Einstellungen können auch Server-Weit (global) verwendet werden.
SET SESSION max_recursive_iterations = 4294967295SET SESSION cte_max_recursion_depth = 4294967295Weiterführende Links
Einführung:
With— komplexe Abfragen strukturierenStandard-Funktionen
E071-01, “UNION DISTINCT table operator“
Nicht-Standard Funktionen
Syntax-Varianten der
Cycle-KlauselMariaDB:
cycle … restrictOracle Datenbank:
cycleohneusing
Verwandte Funktionen
Oracle Datenbank:
connect by … nocycle

