## Rekursive DECLARE CURSOR-Anweisung (recursive_declare_cursor_statement)

Mit Hilfe der rekursiven DECLARE CURSOR-Anweisung (recursive_declare_cursor_statement) ist es möglich, Stücklisten mittels eines Befehls zu erhalten.

### Syntax

<recursive_declare_cursor_statement> ::=
DECLARE <result_table_name> CURSOR FOR WITH RECURSIVE <reference_name> (<alias_name>,...) AS
(<initial_select> UNION ALL <recursive_select>) <final_select>

<initial_select> ::= <query_spec>
<recursive_select> ::= <query_spec>
<final_select> ::= <select_statement>

DECLARE C CURSOR FOR
WITH RECURSIVE PX (MAJOR, MINOR, NUMBER, MAINMAJOR) AS
(SELECT W,X,Y,W FROM T WHERE W = 'aaa' UNION ALL
SELECT W,X,Y,MAINMAJOR FROM T, PX WHERE MINOR = T.W)
SELECT MAINMAJOR,MINOR,NUMBER FROM PX ORDER BY NUMBER

### Erläuterung

Wenn vor der Ausführung der rekursiven DECLARE CURSOR-Anweisung ein Ergebnistabellenname mit dem angegebenen Referenznamen existierte, so wird der entsprechende Cursor implizit geschlossen.

#### <initial_select>

Die QUERY-Spezifikation initial_select wird ausgeführt und das Ergebnis in eine temporäre Ergebnistabelle eingetragen, deren Name durch die Angabe des Referenznamens reference_name festgelegt ist. Die darin enthaltenen Spaltennamen erhalten die Namen aus der Liste der Alias-Namen. Die Anzahl von Ausgabespalten in der QUERY-Spezifikation muss mit der Anzahl von Alias-Namen übereinstimmen.

#### <recursive_select>

Die QUERY-Spezifikation recursive_select sollte aus einer SELECT-Anweisung bestehen, die mindestens einmal den Referenznamen in der FROM-Klausel und mindestens ein JOIN-Prädikat zwischen dieser und einer anderen Tabelle aus der FROM-Klausel enthält.

Die QUERY-Spezifikation recursive_select wird so lange wiederholt, bis diese kein Ergebnis mehr liefert. Die jeweiligen Ergebnisse werden (logisch) in die temporäre Ergebnistabelle eingetragen, deren Name durch den Referenznamen definiert ist. Diese Tabelle wird immer mehr erweitert. Es ist aber sichergestellt, dass beim n+1-ten Ausführen nur noch die Ergebnisse der n-ten Ausführung verwendet werden, um eine Endlosschleife zu vermeiden.

#### <final_select>

Die SELECT-Anweisung final_select darf nur einen QUERY-Ausdruck enthalten, der aus einer QUERY-Spezifikation besteht.

Es handelt sich um eine SELECT-Anweisung über die Tabelle mit dem angegebenen Referenznamen, in der folgende Elemente verwendet werden können: Set-Funktionen, GROUP-Klausel, HAVING-Klausel, ORDER-Klausel, LOCK-Option