"Rekursive" Table Functions: Ohne Objekttypen
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 ...