SAP NetWeaver AS ABAP Release 750, ©Copyright 2016 SAP AG. Alle Rechte vorbehalten.
ABAP - Schlüsselwortdokumentation → ABAP - Referenz → Externe Daten verarbeiten → ABAP-Datenbankzugriffe → Open SQL → Open SQL - Ändernde Zugriffe → UPDATE dbtab →
UPDATE dbtab - source
Syntax
... { {SET
set_expression1,
set_expression2, ... [WHERE sql_cond]}
| {FROM wa|{TABLE itab}} } ...
Alternativen:
1. ... SET set_expression1, set_expression2, ... [WHERE sql_cond]
2. ... FROM wa
3. ... FROM TABLE itab
Wirkung
Die Angaben in source legen fest, welche Zeilen und Spalten geändert werden. Es können entweder einzelne Spalten mit dem Zusatz SET geändert oder ganze Zeilen mit dem Zusatz FROM überschrieben werden.
Hinter FROM kann entweder ein nicht-tabellenartiges Datenobjekt wa oder eine interne Tabelle itab als Hostvariable oder Hostausdruck angegeben werden. Der Inhalt dieser Datenobjekte bestimmt zum einen, welche Zeile(n) geändert werden, und zum anderen, mit welchen Werten die Zeile(n) überschrieben werden. Den Namen des Arbeitsbereichs bzw. der internen Tabelle soll wie jeder Hostvariable das Fluchtsymbol @ vorangestellt werden.
Hinweis
Die Angabe von Hostvariablen ohne Fluchtsymbol @ ist
obsolet. In den
strikten Modi der Syntaxprüfung ab Release 7.40, SP05 muss das Fluchtsymbol @ angegeben werden.
... SET set_expression1, set_expression2, ... [WHERE sql_cond]
Wirkung
Hinter dem Zusatz SET werden die Änderungen in einer kommaseparierten Liste von Änderungsausdrücken set_expression1, set_expression2, ... angegeben.
Der Zusatz WHERE bestimmt über einen logischen Ausdruck sql_cond, in welchen Zeilen der Datenbanktabelle die Änderungen durchgeführt werden. Für den logischen Ausdruck sql_cond gilt das Gleiche wie für die WHERE-Bedingung der Anweisung SELECT, mit der Ausnahme, dass keine Subqueries auf die zu verändernde Datenbanktabelle ausgewertet werden können. Falls keine WHERE-Bedingung angegeben ist, werden alle Zeilen der Datenbanktabelle geändert.
Der Inhalt von Primärschlüsselfeldern kann nur geändert werden, falls die betroffene Datenbanktabelle nicht mit einer Suchhilfe verknüpft ist und nicht auf Pool- und Cluster-Tabellen zugegriffen wird. Falls durch die Änderungen eine Zeile entstehen würde, die zu doppelten Einträgen im Primärschlüssel oder einem eindeutigen Sekundärindex der Datenbanktabelle führt, wird keine Zeile geändert und sy-subrc auf 4 gesetzt.
Falls der Wert einer Spalte vom Typ LRAW oder LCHR geändert wird, muss auch das zugehörige INT2- der INT4-Feld mit einem Wert versorgt werden.
Hinweise
Beispiel
Siehe UPDATE, Verwendung von SET.
... FROM wa
Wirkung
Bei Angabe eines nicht-tabellenartigen Arbeitsbereichs wa als Hostvariable oder Hostausdruck wird in der Datenbanktabelle eine Zeile gesucht, die im Primärschlüssel den gleichen Inhalt wie das entsprechende Anfangsstück des Arbeitsbereichs hat. Der Arbeitsbereich muss die Voraussetzungen für die Verwendung in Open-SQL-Anweisungen erfüllen.
Falls es in der Datenbank keine Zeile mit dem gleichen Inhalt des Primärschlüssels gibt oder die Änderung zu einem doppelten Eintrag in einem eindeutigen Sekundärindex führen würde, wird die Zeile nicht geändert und sy-subrc auf 4 gesetzt.
Standardmäßig wird eine automatische Mandantenbehandlung durchgeführt, d.h. eine in wa angegebene Mandantenkennung wird nicht berücksichtigt, sondern der aktuelle Mandant verwendet. Dabei wird der Inhalt von wa nicht beeinflusst. Die automatische Mandantenbehandlung kann mit dem Zusatz CLIENT SPECIFIED abgeschaltet werden.
Hinweise
Beispiel
Ändern des Rabatts des Kunden mit der Kundennummer '00017777' (im aktuellen Mandanten) auf 3 Prozent.
DATA wa TYPE scustom.
SELECT SINGLE *
FROM scustom
WHERE id = '00017777'
INTO @wa.
wa-discount = '003'.
UPDATE scustom FROM @wa.
Beispiel
Gleiches Beispiel wie zuvor, aber mit Inline-Deklaration und Hostausdruck.
SELECT SINGLE *
FROM scustom
WHERE id = '00017777'
INTO @DATA(wa).
UPDATE scustom FROM @( VALUE #( BASE wa discount = '003' ) ).
... FROM TABLE itab
Wirkung
Bei der Angabe einer internen Tabelle itab als Hostvariable oder Hostausdruck bearbeitet das System alle Zeilen der internen Tabelle gemäß den Regeln für den Arbeitsbereich wa, mit der Ausnahme, dass bei Angabe einer internen Tabelle zwar Lokatoren als Quelle dienen aber keine Schreibströme erzeugt werden können.
Der Zeilentyp der internen Tabelle muss die Voraussetzungen für die Verwendung in Open-SQL-Anweisungen erfüllen.
Falls es in der Datenbank zu einer Zeile der internen Tabelle keine Zeile mit dem gleichen Inhalt des Primärschlüssels gibt oder die Änderung zu einem doppelten Eintrag in einem eindeutigen Sekundärindex führen würde, wird die entsprechende Zeile nicht geändert und sy-subrc auf 4 gesetzt. Ist die interne Tabelle leer, werden keine Zeilen geändert, sy-subrc wird aber dennoch auf 0 gesetzt. Das Systemfeld sy-dbcnt wird immer auf die Anzahl der tatsächlich eingefügten Zeilen gesetzt.
Hinweise
Beispiel
Verringerung des Flugpreises aller heutigen Flüge einer Fluggesellschaft in der Datenbanktabelle SFLIGHT um den Prozentsatz percent. Die Berechnung des neuen Preises wird in einer internen Tabelle sflight_tab vorgenommen und mit dieser die Datenbanktabelle geändert.
PARAMETERS: p_carrid TYPE sflight-carrid,
percent TYPE p LENGTH 1 DECIMALS 0.
DATA sflight_tab TYPE TABLE OF sflight.
FIELD-SYMBOLS <sflight> TYPE sflight.
SELECT *
FROM sflight
WHERE carrid = @p_carrid AND
fldate = @sy-datum
INTO TABLE @sflight_tab.
IF sy-subrc = 0.
LOOP AT sflight_tab ASSIGNING <sflight>.
<sflight>-price =
<sflight>-price * ( 1 - percent / 100 ).
ENDLOOP.
ENDIF.
UPDATE sflight FROM TABLE @sflight_tab.
Beispiel
Gleiches Beispiel wie zuvor, aber mit Inline-Deklaration und Hostausdruck.
PARAMETERS: p_carrid TYPE sflight-carrid,
percent TYPE p LENGTH 1 DECIMALS 0.
SELECT *
FROM sflight
WHERE carrid = @p_carrid AND
fldate = @sy-datum
INTO TABLE @DATA(sflight_tab).
IF sy-subrc = 0.
UPDATE sflight FROM TABLE @( VALUE #(
FOR <sflight> IN sflight_tab
( VALUE #(
BASE <sflight>
price = <sflight>-price * ( 1 - percent / 100 ) ) ) ) ).
ENDIF.