Anfang des Inhaltsbereichs

Tabellenzeilen löschen Dokument im Navigationsbaum lokalisieren

Die Open SQL-Anweisung zum Löschen von Zeilen in Datenbanktabellen ist:

DELETE [FROM] <target> <lines>.

Diese Anweisung ermöglicht es, einzelne oder mehrere Zeilen <lines> aus einer Datenbanktabelle <target> zu löschen. Aus einen View aus dem ABAP Dictionary können nur dann Zeilen gelöscht 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>:

DELETE [FROM] <dbtab> [CLIENT SPECIFIED] <lines>.

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

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

DELETE [FROM] (<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.

Zeilen über Bedingungen auswählen

Um die zu löschenden Zeilen über eine Bedingung auszuwählen, schreibt man für <lines>:

DELETE FROM <target> WHERE <cond> .

Alle Zeilen der Datenbanktabelle, die den Bedingungen der WHERE-Klausel genügen, werden gelöscht. Hier muß der Ausdruck FROM zwischen Schlüsselwort und Datenbanktabelle stehen.

Die WHERE-Klausel sollte sehr sorgfältig programmiert werden, damit nicht versehentlich die falschen Zeilen gelöscht werden. Beispielsweise löscht die Angabe einer leeren internen Tabelle in der dynamischen WHERE-Klausel alle Zeilen.

Falls mindestens eine Zeile gelöscht wurde, wird SY-SUBRC auf 0, ansonsten auf 4 gesetzt. SY-DBCNT wird auf die Anzahl der gelöschten Zeilen gesetzt.

Einzelne Zeilen über Arbeitsbereiche auswählen

Statt über eine WHERE-Klausel lassen sich zu löschende Zeilen auch über den Inhalt von Arbeitsbereichen angeben. Man schreibt für <lines>:

DELETE <target> FROM <wa> .

Es wird die Zeile gelöscht, die den gleichen Primärschlüssel hat, wie der Arbeitsberich <wa>. Hier darf der Ausdruck FROM nicht zwischen Schlüsselwort und Datenbanktabelle stehen. Der Arbeitsbereich <wa> muß ein Datenobjekt sein, das mindestens die gleiche Länge und die gleiche Ausrichtung wie der Primärschlüssel der Zeilen der Datenbanktabelle hat. Der Schlüssel wird entsprechend der Struktur der Tabellenzeile und unabhängig von der Struktur des Arbeitsbereichs gelesen. Es empfiehlt sich den Arbeitsbereich mit Bezug auf die Struktur der Datenbanktabelle zu deklarieren.

Falls die Datenbanktabelle eine 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 gelöscht und SY-SUBRC wird auf 4 gesetzt.

Ein Kurzform obiger Anweisung ist:

DELETE <dbtab>.

In diesem Fall wird implizit der Inhalt des Tabellenarbeitsbereich <dbtab> zum Löschen einer Zeile aus der gleichnamigen Datenbanktabelle verwendet. 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 über eine interne Tabelle auswählen

Mehrere Zeilen lassen sich auch unter Verwendung einer internen Tabelle zu löschen:

DELETE <target> FROM TABLE itab <wa> .

Es werden alle Zeilen aus der Datenbanktabelle gelöscht, die den gleichen Primärschlüssel haben, wie eine der Zeilen der internen Tabelle <itab>. Für den Zeilentyp von <itab> gilt das gleiche wie oben für den Arbeitsbereich <wa>.

Falls eine Zeile nicht gelöscht werden kann, da der entsprechende Primärschlüssel nicht in der Datenbanktabelle vorhanden ist, wird nicht gesamte Anweisung abgebrochen, sondern die Bearbeitung wird mit der nächsten Zeile der internen Tabelle fortgesetzt.

Falls alle Zeilen der internen Tabelle verwendet werden, wird SY-SUBRC auf 0, ansonsten auf 4 gesetzt. Falls nicht alle Zeilen verwendet werden, kann die Anzahl der nicht verwendeten Zeilen aus der Differenz der gelöschten Zeilen in SY-DBCNT und der Zeilenanzahl der internen Tabelle berechnet werden. Falls die interne Tabelle leer ist , werden SY-SUBRC und SY-DBCNT auf 0 gesetzt.

Wenn mehrere Zeilen gelöscht werden sollen, ist das Arbeiten mit internen Tabellen performanter als das zeilenweise Löschen einzelner Zeilen.

Beispiele

Beispiel

DELETE FROM sflight WHERE planetype = 'A310' AND
                             carrid = 'LH'.

Es werden alle Zeilen aus SFLIGHT gelöscht, deren Spalten PLANETYPE A310, und deren Spalten CARRID LH enthalten.

Beispiel

TABLES spfli.

DATA: BEGIN OF wa,
carrid TYPE spfli-carrid,
connid TYPE spfli-connid,
END OF wa.

MOVE 'AA' TO wa-carrid.
MOVE '0064' TO wa-connid.
DELETE spfli FROM wa.

MOVE 'LH' TO spfli-carrid.
MOVE '0017' TO spfli-connid.

DELETE spfli.

CARRID und CONNID sind die Primärschlüsselfelder der Tabelle SPFLI. Die Zeilen, mit den Primärschlüsseln AA 0064 und LH 0017 werden gelöscht. Die Variante mit einem durch TABLES deklarierten Tabellenarbeitsbereich sollte nicht mehr verwendet werden.

 

Beispiel

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

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

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

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

...

DELETE spfli FROM TABLE itab.

Es wird eine Hash-Tabelle ITAB mit der Struktur des Primärschlüssels der Datenbanktabelle SPFLI definiert. Nach dem Füllen von ITAB werden die Zeilen in SPFLI gelöscht, die in den Feldern des Primärschlüssels den gleichen Inhalt wie die entsprechenden Felder einer Zeile der internen Tabelle haben.

Ende des Inhaltsbereichs