Veröffentlicht: von

Multitable INSERT

  1. Neben den bekannten Möglichkeiten, per SUBQUERY in einem CREATE TABLE-Befehl, einem INSERT , UPDATE oder DELETE große Datenmengen in einem Befehl zu ändern, gibt es noch den MULTITABLE INSERT (Oracle spezifisch) und den MERGE-Befehl (SQL-Standard).
  2. Mit dem Multi Tabler INSERT können verschiedene Tabellen gleichzeitig mit dem Ergebnis einer Unterabfrage unter einer WHEN-Bedingung gefüllt werden.
  3. Der MULTITABLE INSERT bietet drei Möglichkeiten
    1. ALL: Ohne WHEN-Bedingung werden mehrere Tabellen mit den Daten aus einer Unterabfrage gefüllt (Seite 572)
    2. FIRST: Nur die erste WHEN ELSE-Klausel wird berücksichtigt (Seite 575)
    3. ALL geht auch beim matchen einer WHEN-Bedingung alle weiteren WHENs durch, wobei FIRST bei dem ersten match aufhört
    1. Multiple WHEN-Klauseln ohne ALL und FIRST: Je nach Bedingung sind verschiedene INSERTS in unterschiedliche Tabellen möglich (S. 576)
  4. Die Unterabfrage beim MULTITABLR-INSERT ist unverzichtbar.
  5. Table-Alias aus einer Subquery können nicht im INSERT verwendet werden, statt dessen sind Spaltennamen erforderlich (siehe Seite 579)
  6. Wenn ein Multi Table INSERT fehlschlägt, wird die komplette Anweisung zurückgerollt.

MERGE

  1. MERGE ist ein DML-Befehl, mit dem man einen INSERT, einen UPDATE und einen DELETE-Befehl gleichzeitig ausführen kann. (Syntax: Seite 583).
  2. USING … ON … wählt ähnlich wie bei einem JOIN die Tabellen, VIEW  bzw. die Unterabfrage aus, die als Quelle für die MERGE-Anweisung genutzt werden soll.
  3. Ähnlich wie beim Multi-Table INSERT gibt es WHEN-MATCHED-Klauseln, die spezifizieren, wann eine UPDATE und wann eine INSERT erfolgen soll.
  4. Die DELETE-Klausel ist Bestandteil des UPDATE-Asts, d.h. wird nur ausgeführt, wenn die Daten vorher durch UPDATE geändert wurden und dann zusätzlich die zugehörige DELETE-WHERE-Klausel greift.

FLASH-BACK-Query

  1. Mit diesem Abfrage -Type können Daten aus der Vergangenheit abgefragt werden.
  2. Mit AS OF in SELECT können Daten abgefragt werden, die durch einen Zeitstempel in der Vergangenheit oder durch eine SCN gekennzeichnet werden.
  3. SELECT * FROM Test AS OF TIMESTAMP SYSTIMESTAMP – INTERVAL(0 0:01:30′ DAY to second fragt die Daten ab, die vor 0 Tagen, 0 Stunden, einer Minute und 30 Sekunden in der Tabelle Test standen.
  4. Das geht auch noch auf andere Weise… muss hier noch ergänzt werden, z. B. VERSIONS BETWEEN(Seite 594)
  5. Unter V$SYSTEM_PARAMETER gibt es mehrere undo-Parameter, unter anderem undo_retention. In undo_retention  wird die Zeit in Sekunden gespeichert, bis zu der historische Daten abgefragt werden können. Möglich sind mehrere Minuten bis zu evt. mehrere Stunden. Jedoch steigt dadurch natürlich der Speicherplatzbedarf immens.