Anfang des Inhaltsbereichs

Tabellenzeilen einfügen Dokument im Navigationsbaum lokalisieren

Die Open SQL-Anweisung zum Einfügen von Zeilen in Datenbanktabellen ist:

INSERT INTO <target> <lines>.

Diese Anweisung ermöglicht es, einzelne oder mehrere Zeilen <lines> in eine Datenbanktabelle <target> einzufügen. In einen View aus dem ABAP Dictionary können nur dann Zeilen eingefügt werden, wenn sich der View auf eine einzige Tabelle bezieht und der Pflegestatus des Views im Dictionary ohne Einschränkung ist. Die Datenbanktabelle <target> kann statisch und dynamisch angegeben werden.

Datenbanktabelle angeben

Um die Datenbanktabelle statisch anzugeben, schreibt man für <target>:

INSERT INTO <dbtab> [CLIENT SPECIFIED] <lines>.

Dabei ist <dbtab> der Name einer im ABAP-Dictionary bekannten Datenbanktabelle.

Um die Datenbanktabelle dynamisch anzugeben, schreibt man <target>:

INSERT INTO (<name>) [CLIENT SPECIFIED] <lines>.

Dabei enthält das Feld <name> den Namen einer im ABAP-Dictionary bekannten Datenbanktabelle.

Mit dem Zusatz CLIENT SPECIFIED kann die automatische Mandantenbehandlung abgeschaltet werden.

Einzelne Zeilen einfügen

Um eine einzelne Zeile in eine Datenbanktabelle einzufügen, schreibt man für <lines>:

INSERT INTO <target> VALUES <wa> .

Der Inhalt des Arbeitsbereichs <wa> wird in die Datenbanktabelle <dbtab> geschrieben. Der Arbeitsbereich <wa> muß ein Datenobjekt sein, das mindestens die gleiche Länge und die gleiche Ausrichtung wie die Zeilen der Datenbanktabelle hat. Die Daten werden entsprechend der Struktur der Tabellenzeile und unabhängig von der Struktur des Arbeitsbereichs in die Datenbanktabelle gestellt. Es empfiehlt sich den Arbeitsbereich mit Bezug auf die Struktur der Datenbanktabelle zu deklarieren.

Falls die Datenbanktabelle noch keine Zeile mit dem gleichen Primärschlüssel wie im Arbeitsbereich angegeben enthält, wird die Operation durchgeführt und SY-SUBRC auf 0 gesetzt. Ansonsten wird keine Zeile eingefügt und SY-SUBRC wird auf 4 gesetzt.

Einzelne Zeilen können auch über folgende Kurzformen der INSERT-Anweisung eingefügt werden:

INSERT <target> FROM <wa >.

Bei der Ersetzung des Ausdrucks VALUE durch FROM kann der Ausdruck INTO weggelassen werden. Noch kürzer ist:

INSERT <dbtab>.

In diesem Fall wird implizit der Inhalt des Tabellenarbeitsbereich <dbtab> in die gleichnamige Datenbanktabelle geschrieben. Der Tabellenarbeitsbereich muß mit der Anweisung TABLES deklariert werden. Die dynamische Angabe der Datenbanktabelle ist dann nicht möglich. Die vor Release 4.0 notwendige Deklaration des Tabellenarbeitsbereichs sollte heute nicht mehr verwendet werden, um Doppeldeutigkeiten zu vermeiden.

Mehrere Zeilen einfügen

Um mehrere Zeilen in eine Datenbanktabelle einzufügen, schreibt man für <lines>:

INSERT <target> FROM TABLE <itab> [ACCEPTING DUPLICATE KEYS] .

Alle Zeilen der internen Tabelle <itab> werden auf einmal in die Datenbanktabelle eingefügt. Für den Zeilentyp von <itab> gilt das gleiche wie oben für den Arbeitsbereich <wa>.

Falls alle Zeilen eingefügt werden können, wird SY-SUBRC auf 0 gesetzt. Falls nur eine der Zeile nicht eingefügt werden kann, da schon eine Zeile mit dem gleichen Primärschlüssel in der Datenbanktabelle existiert, kommt es zu einem Laufzeitfehler. Der Laufzeitfehler kann mit dem Zusatz ACCEPTING DUPLICATE KEYS verhindert werden. Dann werden die entsprechenden Zeilen verworfen und nicht eingefügt und SY-SUBRC wird auf 4 gesetzt.

Das Systemfeld SY-DBCNT wird unabhängig vom Wert in SY-SUBRC auf die Anzahl der eingefügten Zeilen gesetzt.

Wenn mehrere Zeilen eingefügt werden sollen, ist das Arbeiten mit internen Tabellen performanter als das zeilenweise Einfügen einzelner Zeilen.

Beispiele

Beispiel

Einzelne Zeilen.

TABLES spfli.

DATA wa TYPE spfli.

wa-carrid = 'LH'.
wa-cityfrom = 'WASHINGTON'.
...
INSERT INTO spfli VALUES wa.

wa-carrid = 'UA'.
wa-cityfrom = 'LONDON'.
...
INSERT spfli FROM wa.

spfli-carrid = 'LH'.
spfli-cityfrom = 'BERLIN'.
...
INSERT spfli.

Es werden einzelne Zeilen über die drei hierfür möglichen Varianten der INSERT-Anweisung in die Datenbanktabelle SPFLI eingefügt.

Statt

INSERT spfli

in der letzten Zeile, könnte man z.B. auch die längeren Formen

INSERT spfli FROM spfli

oder

INSERT INTO spfli VALUES spfli

schreiben. Der Name SPFLI ist also doppeldeutig.

Diese Varianten der Anweisung INSERT funktionieren nur mit einem durch TABLES deklarierten Tabellenarbeitsbereich und sollten daher nicht mehr verwendet werden.

Beispiel

DATA: itab TYPE HASHED TABLE OF spfli
WITH UNIQUE KEY carrid connid,
wa LIKE LINE OF itab.

wa-carrid = 'UA'. wa-connid = '0011'. wa-cityfrom = ...
INSERT wa INTO TABLE itab.

wa-carrid = 'LH'. wa-connid = '1245'. wa-cityfrom = ...
INSERT wa INTO TABLE itab.

wa-carrid = 'AA'. wa-connid = '4574'. wa-cityfrom = ...
INSERT wa INTO TABLE itab.

...

INSERT spfli FROM TABLE itab ACCEPTING DUPLICATE KEYS.

IF sy-subrc = 0.
...
ELSEIF sy-subrc = 4.
...
ENDIF.

Es wird eine Hash-Tabelle ITAB gefüllt und auf einmal in die Datenbanktabelle SPFLI geschrieben. Der Erfolg der Operation wird anhand SY-SUBRC geprüft.

Ende des Inhaltsbereichs