Show TOC 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. Die Datenbanktabelle target kann, wie im Abschnitt Tabellezeilen einfügen beschrieben, statisch und dynamisch angegeben 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 muss 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 Arbeitsbereich wa. Hier darf der Ausdruck FROM nicht zwischen Schlüsselwort und Datenbanktabelle stehen. Der Arbeitsbereich wa muss 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 muss 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