Anmerkungen zu INSERT ALL

Seit Oracle 9i gibt es die Option des sogenannten „Multi-Table Insert“, mit dem die bekannte INSERT … SELECT … – Syntax so erweitert wurde, daß die Ergebnisse aus dem SELECT auf mehrere Tabellen verteilt werden können. Ein paar Beispiele stehen in der Oracle-Doku.

INSERT ALL und Sequences

Nicht ganz intuitiv ist die Verwendung von Sequences: Soll z.B. in einer Master-Detail-Beziehung eine ID aus einer Sequence mehrfach verwendet werden, so kommt nicht CURRVAL zum Einsatz, sondern es muß überall NEXTVAL verwendet werden:

INSERT ALL
      INTO master_tab ( id, kunde_nr, ... )
    VALUES ( master_seq.NEXTVAL, ... )
      INTO detail_tab ( master_id, detail_nr, ... )
    VALUES ( master_seq.NEXTVAL, 1, ... )
    SELECT kunde_nr
      FROM tmp_aktive_kunden;

Bugs mit Master-Detail-Tabellen

Wenn man das obige Beispiel einmal ausprobiert, kann es durchaus vorkommen, daß es abbricht, wenn eine Fremdschlüsselbeziehung zwischen den Tabellen vorliegt.

ORA-02291: integrity constraint violated - parent key not found

Es handelt sich dabei um den seit 2003 bis heute noch nicht behobenen Bug 2891576. Dieser Bug lässt sich umgehen, indem das vorhandene Constraint entweder deaktiviert oder mit Deferred Constraints gearbeitet wird.

Allerdings gibt es auch beim Workaround einen Wermutstropfen: In einem Szenario mit zwei Tabellen von je etwa 2 Millionen Datensätzen und einem Insert von je 400000 Datensätzen kam es auf einem meiner Testsysteme (10.2.0.3, HP-UX 11.31 Itanium) zu sehr langen Laufzeiten, wenn Deferred Constraints verwendet wurden. Ohne Constraint war das Statement in Sekunden durch. Eine Klärung durch Oracle steht noch aus, ich werde den Artikel dann ergänzen.

Edit vom 21.1.2010:
Für den o.g. „Wermutstropfen“ ist bei Oracle inzwischen der Bug #9169330 erfasst, der momentan aber nicht öffentlich einsehbar ist. Auf jeden Fall arbeitet Oracles Entwicklungsteam daran.

Weblinks

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s