Die Anforderung: Es soll ein Insert in eine Tabelle erfolgen. Dabei werden die einzufügenden Daten aus anderen Tabellen zusammengesucht.
Unter Oracle könnte dann z.B. so aussehen:
insert into adressen (name, strasse, plz, ort)
select benutzer.name, anschrift.strasse, anschrift.plz, anschrift.ort
Jetzt benötigen wir in unserem Beispiel aber einen eindeutigen Index um in die Tabelle ‚adressen‘ schreiben zu können, doch woher nehmen?
Oracle liefert in der Variable ‚rownum‘ für jeden Ergebnissatz die Zeilennummer des Satzes innerhalb der Ergebnismenge mit. Diesen Wert, beginnend bei 1, können wir gut dafür nutzen:
insert into adressen (zeile, name, strasse, plz, ort)
select rownum, benutzer.name, anschrift.strasse, anschrift.plz, anschrift.ort
Jedoch soll/muß unser Index allerdings an den bereits vorhandenen Sätzen angefügt werden. Dazu ermitteln wir den maximalen vorhandenen Wert und addieren unsere Zeilennummer:
insert into adressen (zeile, name, strasse, plz, ort)
select rownum+(select max(zeile) from adressen),
benutzer.name, anschrift.strasse, anschrift.plz, anschrift.ort
Abschließend fangen wir noch den Fehler ab, den das Subselect verursacht, wenn in der Zieltabelle noch keine Sätze enthalten sind:
insert into adressen (zeile, name, strasse, plz, ort)
select rownum+(select max(zeile)
case when decode(max(zeile),NULL,0,'',0,' ',0,1) = 0 then 0
else max(zeile) end
from adressen),
benutzer.name, anschrift.strasse, anschrift.plz, anschrift.ort