Erst vor kurzem hatte ich ein wenig was über die neue rekursive WITH-Klausel gepostet. Diese ist ab Version 11.2 verfügbar und erlaubt es, hierarchische Abfragen ohne START WITH - CONNECT BY zu formulieren.
Interessant ist, dass diese Technik es auch erlaubt, Table Functions auf eine andere Art zu bauen - man kann sich so eine SQL-Abfrage schreiben, die mit Hilfe der Rekursion zusätzliche Tabellenzeilen generieren kann. Hier ein Beispiel: Den Tilgungsplan, der hier als "klassische" Table Function bereitsteht, kann man auch mit einer rekursiven WITH-Klausel bauen. Das sähe dann so aus ...
col kapital format 999999990D00 col zinsen format 999999990D00 col tilgung format 999999990D00 col restwert format 999999990D00 with konstanten (datum, kapital, zinssatz, rate, rhythmus) as ( select trunc(sysdate, 'MONTH') datum, 100000 kapital, 5 zinssatz, 600 rate, 1 rhythmus from dual ), tilgungsplan (datum, kapital, zinsen, tilgung, restwert) as ( select to_char(k.datum) datum, k.kapital, k.kapital * k.zinssatz / (100 * (12 / k.rhythmus)) zinsen, k.rate - k.kapital * k.zinssatz / (100 * (12 / k.rhythmus)) tilgung, k.kapital - ( k.rate - k.kapital * k.zinssatz / (100 * (12 / k.rhythmus))) restwert from konstanten k union all ( select to_char(add_months(to_date(s.datum),k.rhythmus)) datum, s.restwert kapital, s.restwert * k.zinssatz / (100 * (12 / k.rhythmus)) zinsen, least( k.rate - s.restwert * k.zinssatz / (100 * (12 / k.rhythmus)), s.restwert ) tilgung, s.restwert - ( least( k.rate - s.restwert * k.zinssatz / (100 * (12 / k.rhythmus)), s.restwert ) ) restwert from konstanten k, tilgungsplan s where restwert > 0 ) ) select * from tilgungsplan /
Der Vorteil ist, dass man keine Objekttypen zum Beschreiben der Ergebnismenge mehr braucht - man kann eine solche Abfrage mit nichts weiter als einem CREATE SESSION-Privileg ausführen.
Allerdings sind die "klassischen" Table Functions (im Moment noch) wesentlich schneller - wer möchte, kann
es ja vergleichen. Man kann auf jeden Fall festhalten, dass man mit der rekursiven WITH-Klausel mehr machen
kann, als Parent-Child-Beziehungen abzufragen ...