Show TOC

Tabellenzeilen ändernLocate this document in the navigation structure

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

UPDATE target lines.

Diese Anweisung ermöglicht es, einzelne oder mehrere Zeilen
linestargettarget
in eine Datenbanktabelle zu ändern. Die Datenbanktabelle 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 set 1 set 2 ... [WHERE cond].

Die WHERE-Klausel bestimmt die zu ändernden Zeilen. Ohne
WHERE
-Klausel werden alle Zeilen geändert. Die Ausdrücke
set1, set2, ...
-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:
  • s 1 = f
    Der Wert in Spaltes 1 wird für alle selektierten Zeilen auf den Wert von
    f
    gesetzt.
  • s 1 = s 1 + f
    Der Wert in Spaltes 1 wird für alle selektierten Zeilen um den Wert von
    f
    erhöht.
  • s 1 = s 1 - f
    Der Wert in Spaltes 1 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-subrcsy-dbcnt
auf 0,ansonsten auf 4 gesetzt. 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
wadbtabwa
überschreibt in der Datenbanktabelle die Zeile mit dem gleichen Primärschlüssel. Der Arbeitsbereich 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-subrcsy-subrc
auf 0 gesetzt. Ansonsten wird keine Zeile geändert und 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
itabdbtabitabwa
überschreibt in der Datenbanktabelle die Zeilen mit dem gleichen Primärschlüssel. Für den Zeilentyp von gilt das gleiche wie oben für den Arbeitsbereich .

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-subrcsy-dbcntsy-subrcsy-dbcnt
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 und der Zeilenanzahl der internen Tabelle berechnet werden. Falls die interne Tabelle leer ist , werden und auf 0 gesetzt.

Wenn mehrere Zeilen überschrieben werden sollen, ist das Arbeiten mit internen Tabellen performanter als das zeilenweise Überschreiben einzelner Zeilen.

Beispiele
Tipp
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.

Tipp
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
waspfliTABLES
bzw. des Tabellenarbeitsbereichs ersetzt. Die Variante mit einem durch deklarierten Tabellenarbeitsbereich sollte nicht mehr verwendet werden.
Tipp
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.