Show TOC Anfang des Inhaltsbereichs

Tabellenzeilen ändern  Dokument im Navigationsbaum lokalisieren

Die Open SQL-Anweisung zum Ändern von Zeilen in Datenbanktabellen ist:

UPDATE target lines.

Diese Anweisung ermöglicht es, einzelne oder mehrere Zeilen lines in eine Datenbanktabelle target zu ändern. Die Datenbanktabelle target kann, wie im Abschnitt Tabellenzeilen einfügen beschrieben, statisch und dynamisch angegeben werden.

Zeilen spaltenweise ändern

Um bestimmte Spalten in der Datenbanktabelle zu ändern, schreibt man für lines:

UPDATE target SET set1 set2 ... [WHERE cond].

Die WHERE-Klausel bestimmt die zu ändernden Zeilen. Ohne WHERE-Klausel werden alle Zeilen geändert. Die Ausdrücke set1 set2 … sind drei verschiedene SET-Anweisungen, die bestimmen welche Spalten (set1 ändert Spalte s1) wie geändert werden sollen:

·        s1 = f

Der Wert in Spalte s1 wird für alle selektierten Zeilen auf den Wert von f gesetzt.

·        s1 = s1 + f

Der Wert in Spalte s1 wird für alle selektierten Zeilen um den Wert von f erhöht.

·        s1 = s1 - f

Der Wert in Spalte s1 wird für alle selektierten Zeilen um den Wert von f vermindert.

Dabei kann f ein Datenobjekt oder selbst eine Spalte der Datenbanktabelle sein. Die Spalten werden direkt über ihren Namen benannt.

Falls mindestens eine Zeile geändert wurde, wird  sy-subrc auf 0,ansonsten auf 4 gesetzt. sy-dbcnt wird auf die Anzahl der geänderten Zeilen gesetzt.

Bei der Verwendung von SET-Anweisungen ist die dynamische Angabe der Datenbanktabelle nicht möglich.

Einzelne Zeilen mit Arbeitsbereichen überschreiben

Um eine einzelne Zeile in einer Datenbanktabelle mit dem Inhalt eines Arbeitsbereichs zu überschreiben, schreibt man für lines:

UPDATE target FROM wa.

Der Inhalt des Arbeitsbereichs wa überschreibt in der Datenbanktabelle dbtab die Zeile mit dem gleichen Primärschlüssel. Der Arbeitsbereich wa muss 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 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 geändert und sy-subrc wird auf 4 gesetzt.

Ein Kurzform obiger Anweisung ist:

UPDATE dbtab.

In diesem Fall wird implizit der Inhalt des Tabellenarbeitsbereich dbtab zum Ändern 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 mit internen Tabellen überschreiben

Um mehrere Zeilen einer Datenbanktabelle mit dem Inhalt einer internen Tabelle zu überschreiben, schreibt man für lines:

UPDATE target FROM TABLE itab.

Der Inhalt der Zeilen der internen Tabelle itab überschreibt in der Datenbanktabelle dbtab die Zeilen mit dem gleichen Primärschlüssel. Für den Zeilentyp von itab gilt das gleiche wie oben für den Arbeitsbereich wa.

Falls eine Zeile nicht geändert werden kann, da der entsprechende Primärschlüssel nicht in der Datenbanktabelle vorhanden ist, wird gesamte Anweisung nicht 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 verarbeiteten 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 überschrieben werden sollen, ist das Arbeiten mit internen Tabellen performanter als das zeilenweise Überschreiben einzelner Zeilen.

Beispiele

Beispiel

UPDATE sflight SET planetype = 'A310'
               price = price - '100.00'
               WHERE carrid = 'LH' AND connid = '0402'.

In allen Zeilen der Datenbanktabelle SFLIGHT, in denen die Spalten CARRID und CONNID LH 402 enthalten, wird der Inhalt der Spalte PLANETYPE auf A310 gesetzt und der Inhalt der Spalte PRICE wird um 100,00 vermindert.

Beispiel

TABLES spfli.

DATA wa TYPE spfli.

MOVE 'AA'         TO wa-carrid.
MOVE '0064'       TO wa-connid.
MOVE '
WASHINGTON' TO wa-cityfrom.
...
UPDATE spfli FROM wa.

MOVE 'LH'     TO spfli-carrid.
MOVE '0017'   TO spfli-connid.
MOVE '
BERLIN' TO spfli-cityfrom.
...
UPDATE spfli.

CARRID und CONNID sind die Felder des Primärschlüssels der Tabelle SPFLI. Alle Feldwerte in den Zeilen, in denen der Primärschlüssel AA 0064" oder LH 0017" ist, werden durch die Werte des Arbeitsbereichs wa bzw. des Tabellenarbeitsbereichs spfli ersetzt. Die Variante mit einem durch TABLES deklarierten Tabellenarbeitsbereich sollte 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.

...

UPDATE spfli FROM TABLE itab.

Es wird eine Hash-Tabelle itab gefüllt und die Zeilen in SPFLI, die in den Feldern des Primärschlüssels (CARRID und CONNID) den gleichen Inhalt wie eine Zeile der interne Tabelle haben, werden von dieser überschrieben.

Ende des Inhaltsbereichs