Ansicht
Dokumentation

ABAPSHEET_ABAP_SQL - SHEET ABAP SQL

ABAPSHEET_ABAP_SQL - SHEET ABAP SQL

ROGBILLS - Synchronize billing plans   BAL Application Log Documentation  
Diese Dokumentation steht unter dem Copyright der SAP AG.
SAP E-Book

: Arbeiten mit persistierten Daten in Datenbanktabellen

In diesem Spickzettel finden Sie schnelle Information zum Arbeiten mit persistierten Daten in -Datenbanktabellen. Darüber hinaus bietet er Ihnen eine nützliche Referenzsammlung von Syntax- und Quelltextstücken. Weitere Informationen finden Sie im entsprechenden Abschnitt der ABAP-Schlüsselwortdokumentation.

Datenbanktabellen im AS ABAP im Überblick

Datenbanktabellen im AS ABAP ...

  • bestehen aus Tabellenzeilen und -spalten; jede Zeile stellt einen Datensatz dar, dessen Komponenten (oder Felder) in Spalten vorhanden sind; jede Komponente hat einen Datentyp
  • Eine Tabelle enthält beispielsweise Information über Flugverbindungen, Flugziele und Abflugzeiten und eine andere verwandte Tabelle weitere Angaben zu den Flügen, wie die Belegung eines Fluges oder Preisangaben.

  • Haben mindestens einen Schlüssel, nämlich den primären Schlüssel, um Tabellenzeilen eindeutig zu identifizieren; dieser dürfte eine oder mehrere Spalten am Anfang jeder Datenbanktabelle.
  • Sind entweder mandantenunabhängige oder mandantenabhängige Tabellen, um Datentrennung zu gewährleisten; die überwiegende Mehrheit der Datenbanktabellen sind mandantenabhängige Tabellen und besitzen ein Mandantenfeld (oft MANDT genannt) als erstes Schlüsselfeld.
  • Im wird sichergestellt, dass eine Anweisung Daten ausschließlich aus dem aktuellen Mandanten manipuliert.

  • werden bei der Aktivierung anders als interne Tabellen physisch auf der Datenbank angelegt. Darüber hinaus wird ein gleichnamiger global verfügbarer strukturierter Typ auch angelegt. Daher wird der Name einer Datenbanktabelle in einem ABAP-Programm für die Deklaration von Datenobjekten verwendet, beispielsweise internen Tabellen. Darauf kann auch über zugegriffen werden.
  • werden primär mit -Anweisungen und über Strukturen und interne Tabellen verarbeitet, die das Speichern einer einzelnen Zeile oder das gleichzeitige Speichern von mehreren Datenzeilen auf einmal erlauben.

Exkurs: Views

Views ...

  • sind weitere Objekte des ABAP Dictionary, die spezifische Daten gruppieren.
  • Kombinieren Spalten aus einer oder mehreren Datenbanktabellen.
  • Wie bei Datenbanktabellen bilden die Spalter einer solchen View eine flache Struktur. Daher darf der Name der View auch zur Deklaration von Datenobjekten verwendet werden.

  • Auf die Views kann über zugegriffen werden, vor allem zu Lesezwecken mit SELECT.

"Klassische" DDIC-Views ...

  • sind die älteste Variante von Views.
  • Darauf kann über für Lese- und Schreiboperationen zugegriffen werden, das Schreiben aber wird nur bei einer mit einer Datenbanktabelle angelegten View unterstützt.

"Moderne" Views (seit Release )

  • SAP-HANA-Views sind Entitäten der SAP-HANA-Datenbank, die im SAP HANA Studio definiert werden.

  • Deren Grundlage sind HANA-spezifische Datentypen.

  • Über externe Views des ABAP Dictionary können diese SAP-HANA-Views dem ABAP-Programm "erkennbar" gemacht werden. Dabei können die externe Views wie klassische DDIC-Views als strukturierte Datentypen und eine Quelle für -Leseoperationen verwendet werden.

  • Dienen der Definition von semantisch reichen Datenmodellen.

  • Bieten mehr Möglichkeiten als klassische Views, zum Beispiel werden Annotationen (die Angabe von Information über Views oder einzelne Felder) unterstützt, es können Datenquellen über Assoziationen kombiniert werden, Vereinigungen sind möglich, und Views dürfen mit Eingabeparametern definiert werden.

  • werden wie klassische Datenbank-Views als strukturierte Datentypen und als eine Quelle für -Leseoperation (über SELECT) verwendet.

  • anders als bei externen Views werden sie von allen Datenbanksystemen unterstützt, die die Merkmale des ABAP CDS unterstützen.

  • Was findet bei der Verwendung einer -Anweisung im Hintergrund statt?
  • Im Allgemeinen besitzen Tabellen in relational Datenbanksystemen eine Programmierschnittstelle, die Tabellenzugriff über Standard-SQL erlauben, jedoch sind diese Schnittstellen nicht einheitlich und können eigene Merkmale aufweisen.

  • Um das AS ABAP unabhängig von der eingesetzten Datenbank zu machen, werden -Anweisungen in die entsprechenden Native-SQL-Anweisungen des aktuellen Datenbanksystems konvertiert. Damit bietet einen komfortablen und einheitlichen Zugriff auf die Datenbanktabelle, unabhängig vom eingesetzten Datenbanksystem.

  • Die wichtigsten -Schlüsselwörter für das Lesen und Ändern von Daten sind wie folgt:
Schlüsselwort Zweck
SELECT Daten von Datenbanktabellen lesen
INSERT Zeilen in Datenbanktabellen einfügen
UPDATE Zeileninhalte in Datenbanktabellen ändern
MODIFY Zeilen in Datenbanktabellen einfügen oder Zeileninhalte ändern
DELETE Zeilen aus Datenbanktabellen löschen

Daten über SELECT lesen

Grundsyntax

Mit -SELECT-Anweisungen werden Sätze aus der Datenbank gelesen, entweder durch einen Direktzugriff oder über eine View. Die SELECT-Anweisung enthält mehrere Klauseln, die unterschiedlichen Zwecken dienen. Im folgenden Quelltextausschnitt wird die Grundsyntax gezeigt:

SELECT FROM source "What db tables or views to read from.
  FIELDS field_list "What columns should be read.
  WHERE condition "Specifies conditions on which rows should be read.
  INTO target. "Data object into which data should be read.

  • Weitere Klauseln sind auch vorhanden und werden weiter unten behandelt.
  • Vor allem in älteren ABAP-Programmen sieht man andere Varianten der SELECT-Syntax, die nicht mehr verwendet werden sollen. Zum Beispiel soll die INTO-Klausel hinter den anderen Klauseln stehen. Dies war bei älteren Anweisungen nicht möglich.
  • Die Liste der Felder darf auch direkt hinter dem SELECT-Schlüsselwort stehen und vor der FROM-Klausel. In diesem Fall darf die FIELDS-Klausel nicht angegeben werden. Im Grunde sich die folgenden beiden Quelltextausschnitte gleich:
SELECT FROM dbtab
  FIELDS comp1, comp2, comp3
  ...

SELECT comp1, comp2, comp3
  FROM dbtab
  ...

Verwendung von SELECT 1: Grundlagen

Alle Felder einer einzelnen Zeile in eine Struktur lesen. Das Leseergebnis kann entweder in einer vorhandenen Struktur (struc) oder in einer inline deklarierten Struktur gespeichert werden. Mit einem Stern (*) wird das Lesen aller Felder gekennzeichnet. Alternativ können alle Felder kommasepariert aufgeführt werden. Aus Leistungsgründen sollten aber nur tatsächlich relevante Felder selektiert werden.

  • Es wird angenommen, dass struc den gleichen Strukturtyp wie die Datenbanktabelle dbtab besitzt.
  • Als Alternative zur Syntax unten kann der Zusatz FIELDS wie folgt weggelassen werden: SELECT SINGLE * FROM dbtab WHERE ....
  • @ muss vor ABAP-Variablen stehen, wenn sie Datentabellen manipulieren. Siehe Hostvariablen.
SELECT SINGLE FROM dbtab
  FIELDS *
  WHERE ...
  INTO @struc. "Existing structure of the same type as dbtab.
SELECT SINGLE FROM dbtab
  FIELDS *
  WHERE ...
  INTO @DATA(lv_struc). "Structure declared inline.

Alle Felder mehrerer Zeilen in eine interne Tabelle lesen. Das Leseergebnis kann entweder in einer vorhandenen internen Tabelle (itab) oder in einer inline deklarierten internen Tabelle gespeichert werden. Es wird angenommen, dass itab den gleichen Strukturtyp wie die Datenbanktabelle besitzt.

SELECT FROM dbtab
  FIELDS *
  WHERE ...
  INTO TABLE @itab.

SELECT FROM dbtab
  FIELDS *
  WHERE ...
  INTO TABLE @DATA(lv_itab).

SELECT-Schleife. Sequentielles Lesen von mehreren Zeilen in eine Struktur. Wenn die ermittelte und zurückgegebene Zeile erhalten bleiben soll, ist die weitere Verarbeitung innerhalb einer Anweisung IF sy-subrc = 0. eine Möglichkeit.

SELECT FROM dbtab
  FIELDS *
  WHERE ...
  INTO @struc.
    IF sy-subrc = 0.
      APPEND struc TO itab. "For example, add the line to a table.
    ENDIF.
ENDSELECT.

Selektierte Felder einer einzelnen Zeile in eine vorhandene Struktur mit unterschiedlichem Strukturtyp lesen. Einerseits werden nur bestimmte Spalten über die Angabe der Namen in der FIELD-Klausel gelesen. Andererseits muss beim Zurückgeben des Ergebnisses in einer Struktur mit unterschiedlichem Strukturtype der Zusatz CORRESPONDING FIELDS OF verwendet werden, damit das Ergebnis sinnvoll ist.

  • Wenn nur INTO verwendet wird, müssen die selektierten Spalten in der korrekten Reihenfolge sein, d.h. sie müssen dem Strukturtyp der Zielvariablen entsprechen. Nur der Inhalt von Spalten, die gleichnamige Komponenten in der Struktur des Zieles werden aus der Ergebnismenge gelesen.
  • Wenn gleichnamige Komponenten unterschiedliche Typen haben, versucht das System den Inhalt von Quellfelder in den Typ des Zielfeldes zu konvertieren. Dabei besteht die Gefahr von durch Konvertierungsfehler bedingtem Datenverlust und Laufzeitfehlern.
SELECT SINGLE FROM dbtab
  FIELDS comp1, comp2, comp3
  WHERE ...
  INTO CORRESPONDING FIELDS OF @diff_struc.

Selektierte Felder mehrerer Zeilen in eine vorhandene interne Tabelle mit unterschiedlichem Strukturtyp lesen.

SELECT FROM dbtab
  FIELDS comp1, comp2, comp3
  WHERE ...
  INTO CORRESPONDING FIELDS OF TABLE @diff_itab.

Verwendung von SELECT 2: Klauselvarianten und Zusätze

SELECT/FROM-Klausel:

Vorhandensein einer Zeile in einer Datenbanktabelle prüfen

SELECT SINGLE @abap_true "Instead of @abap_true, you could use 'X'
  FROM dbtab
  WHERE ...
  INTO @DATA(exists).
IF exists = abap_true.
...
ENDIF.

Doppelte Zeilen aus einer mehrzeiligen Ergebnismenge über DISTINCT ausschließen. Die doppelten Einträge könnten durch eine nicht eindeutige WHERE-Klausel bedingt sein.

SELECT DISTINCT comp1
  FROM dbtab
  WHERE ...
  INTO TABLE @itab.

Neue Spaltennamen mit AS setzen

SELECT FROM dbtab
  FIELDS comp1 AS alias1, comp2 AS alias2, comp3 AS alias3
  WHERE ...
  INTO TABLE @DATA(itab_as).

Daten aus einer Datenbanktabelle in einem anderen Mandanten abrufen. Es gibt mehrere Varianten des USING CLIENT-Zusatzes, zum Beispiel kann mit ALL CLIENTS aus Datenbanktabellen in allen Mandanten selektiert werden. Darüber hinaus ist der USING CLIENT-Zusatzes für die -Anweisungen unten, die Datenbanktabelleneinträge modifizieren.

SELECT *
  FROM dbtab USING CLIENT '000'
             "ALL CLIENTS
  WHERE ...
  INTO TABLE @itab.

Aggregierte Daten mit einem SQL-Ausdruck abrufen. Weitere Information über die verschiedenen SQL-Ausdrücke sind in der ABAP-Schlüsselwortdokumentation enthalten. In Beispiel unten wird die Summe aller Werte in der angegebenen Spalte berechnet.

SELECT SUM( comp3 )
  FROM dbtab
  WHERE ...
  INTO @DATA(sum).

Aggregierte Daten mit mehreren SQL-Ausdrücken abrufen. Bei der Verwendung mehrerer SQL-Ausdrücke müssen Aliase definiert werden. In Beispiel unten wird die Summe aller Werte in der angegebenen Spalte berechnet. Darüber hinaus wird der Mittelwert der Werte einer Spalte berechnet. Dabei wird der Datentyp in dem der Mittelwert zurückgegeben wird explizit angegeben, um ein lesbareres Ergebnis zu erhalten.

SELECT SUM( comp2 ) AS sum
             AVG( comp3 AS DEC( 14,4 ) ) AS average
  FROM dbtab
  WHERE ...
  INTO @DATA(sql_expr).

Aggregierte Daten über CASE-Ausdrücke abrufen

DATA(status_a) = 'A'.
  DATA(status_b) = 'B'.
  DATA(status_c) = 'C'.
SELECT comp1, comp2, comp3,
    CASE WHEN comp4 = 100 THEN @status_a
         WHEN comp4 < 50 AND comp5 > 200 THEN @status_b
         ELSE @status_c
    END AS status
  FROM dbtab
  WHERE ...
  INTO TABLE @DATA(itab_case).

FIELD-Klausel:

Aggregierte Daten über SQL-Ausdrücke abrufen. In Beispiel unten wird der Medianwert aller Werte in der angegebenen Spalte berechnet. Darüber hinaus wird eine Subtraktion für die Werte zweier Spalten durchgeführt.

SELECT FROM dbtab
  FIELDS MEDIAN( comp1 ) AS median_value, comp2 - comp4 AS sub
  WHERE ...
  INTO @DATA(median_result).

WHERE-Klausel:

Verschiedene Optionen der WHERE-Klausel zur Einschränkung des Ergebnisses. Ohne eine WHERE-Klausel werden alle Zeile in der Operation berücksichtigt. Die Teile der Klausel, die im folgenden Quelltextausschnitt auskommentiert sind demonstrieren lediglich ein mögliches Erscheinen der WHERE-Klausel und die möglichen Ausdrücke. Es gibt weitere verfügbare Optionen: Weitere Information zu diesen Optionen ist im Abschnitt SQL-Bedingungen der ABAP-Schlüsselwortdokumentation enthalten.

SELECT FROM dbtab
  FIELDS comp1, comp2, comp3
  WHERE comp1 = 'abc' "Equals some value
        "comp2 > 100 "Greater than some value
        "Not equals plus an additional condition that must be considered
        "comp2 <> 100 AND comp4 = 'xyz'
        "(Not) between a value range; including OR operator
        "comp1 BETWEEN 1 AND 10 OR comp3 NOT BETWEEN 20 AND 30
        "A character literal has a certain pattern, preceded and
        "followed by any string.
        "comp1 LIKE '%XYZ%'
        "The second character is not Y. _ stands for any character.
        "comp1 NOT LIKE '_Y%'
        "Contains one of the values specified in the parentheses
        "comp1 IN ( 'ABC', 'DEF', 'GHI' )
        "Does not contain one of the values specified in the parentheses
        "comp1 NOT IN ( 'JKL', 'MNO' )
  INTO TABLE @DATA(itab_where).

Aggregierte Daten über Ausdrücke abrufen. Im Beispiel unten wird eine Subtraktion für die Werte zweier Spalten durchgeführt.

SELECT FROM dbtab
  FIELDS comp1, comp2, comp3
  WHERE comp4 - comp5 < 10
  INTO @DATA(result).

INTO-Klausel:

Absolute Anzahl der zurückgegebenen Tabellenzeilen über den Zusatz UP TO n ROWS einschränken. Im Beispiel unten sollten maximal fünf Zeilen zurückgegeben werden.

SELECT * FROM dbtab
  WHERE ...
  INTO TABLE @DATA(itab_upto) UP TO 5 ROWS.

Ergebnismenge an eine vorhandene interne Tabelle anhängen, die den gleichen Strukturtyp wie die Datenbanktabelle hat. Mit dem Anhängen vermeidet man die Löschung vorhandener Zeilen in internen Tabellen.

SELECT * FROM dbtab
  WHERE ...
  APPENDING TABLE @itab.

Ergebnismenge an eine vorhandene interne Tabelle anhängen, die einen anderen Strukturtyp als die Datenbanktabelle hat.

SELECT * FROM dbtab
  WHERE ...
  APPENDING CORRESPONDING FIELDS OF TABLE @itab.

Einzelne Zeilen in Variablen lesen. Es können auch mehrere Tabelleneinträge über eine SELECT-Schleife verarbeitet werden. Die Anzahl angegebener Spalten (hier in der FIELDS-Klausel) muss die Anzahl Elemente in der INTO-Klausel entsprechen.

SELECT FROM dbtab
  FIELDS comp1, comp2, comp3
  WHERE ...
  INTO (@res1,@res2,@res3).

Beim Lesen in interne Tabellen in Pakete lesen. Mit der Paketgröße wird die Anzahl selektierter Zeilen in einer Ausführung einer Schleife definiert. Dies erweist sich bei sehr großen Mengen zu verarbeitender Daten als nützlich, bei denen die Speicherkapazität einer internen Tabelle überschritten wird und Programme abgebrochen werden können. Die Paketgröße wird als ganze Zahl angegeben. Weitere Information finden Sie hier: PACKAGE SIZE n.

SELECT FROM dbtab
  FIELDS comp1, comp2, comp3
  WHERE ...
  INTO TABLE @DATA(itab_pack) PACKAGE SIZE i.
...
ENDSELECT.

Verwendung von SELECT 3: Weitere Klauseln

GROUP BY-Klausel: Gruppen von Zeilen der Ergebnismenge in eine Zeile kombinieren.

SELECT FROM dbtab
  FIELDS comp1, MIN( comp2 ) AS min, MAX( comp3 ) AS max
  WHERE ...
  GROUP BY comp1
  INTO ...

HAVING-Klausel: Gruppen von Zeilen der Ergebnismenge eine Zeile kombinieren und Bedingungen für aggregierte Zeilen setzen.

SELECT FROM dbtab
  FIELDS comp1, comp2, comp3
  WHERE ...
  GROUP BY comp1, comp2, comp3
  HAVING comp1 LIKE '%XYZ%' AND SUM( comp7 ) > 100
  INTO ...

ORDER BY-Klausel: Ergebnismenge sortieren.

SELECT FROM dbtab
  FIELDS *
  WHERE ...
  ORDER BY PRIMARY KEY
           "comp2 ASCENDING
           "comp2 DESCENDING
  INTO ...

Verwendung von SELECT 4: Aus mehreren Tabellen lesen

Verwendung von FOR ALL ENTRIES: Daten abhängig vom Inhalt einer internen Tabelle aus einer Tabelle lesen.

Es muss sichergestellt werden, dass die gelesene interne Tabelle nicht initial ist. Es wird empfohlen, wie im nächsten Beispiel eine Subquery zu verwenden und eine SELECTAnweisung, die aus der internen Tabelle liest (... ( SELECT ... FROM itab2 WHERE ...) zu verwenden.

IF ( 0 < lines( itab2 ) ).
SELECT comp1, comp2, comp3
  FROM dbtab
  FOR ALL ENTRIES IN @itab2
  WHERE comp1 = @itab2-comp1 ...
  INTO TABLE @itab1
ENDIF.

Verwendung einer Subquery: Abhängig von den Daten einer anderen Datenbanktabelle aus einer Datenbanktabelle lesen. Weitere Informationen: EXISTS. Die Komponenten der Tabelle werden über ~ referenziert.

SELECT comp1, comp2, comp3
  FROM dbtab AS tab1
  WHERE EXISTS
   ( SELECT comp1 FROM dbtab2
     WHERE comp1 = tab1~comp1 AND comp2 = tab1~comp2 )
  INTO ...

Verwendung eines inneren Joins: Daten aus mehreren Datenbanktabellen kombinieren. In dieser Art des Joins werden Spalten mit Zeilen der linken Seite und Spalten der rechten Seite nur beim Erfüllen der Join-Bedingungen durch die Zeilen (ON ...) verknüpft. Wenn keine äquivalenten Einträge in der ersten oder zweiten Tabellen vorhanden sind, werden die Zeilen nicht verknüpft.

SELECT a~comp1, a~comp2, b~comp3, c~comp4
  FROM dbtab1 AS a
  INNER JOIN dbtab2 AS b
   ON a~comp1 = b~comp1 AND a~comp2 = b~comp2
  INNER JOIN dbtab3 AS c
   ON a~comp1 = c~comp1
  WHERE ...
  INTO ...

Verwendung eines links äußeren Joins: Daten aus mehreren Datenbanktabellen kombinieren. Die Spalten jeder Zeile auf der rechten Seite, die die ON-Bedingung nicht erfüllen, werden mit initialen Werten gefüllt und mit den Spalten der linken Seite verknüpft. Beim Erfüllen der Bedingungen der WHERE-Klausel erzeugt jede Zeile auf der linken Seite des links äußeren Joins mindestens eine Zeile in der Selektion, unabhängig von der ON-Bedingung.

SELECT a~comp1, a~comp2, b~comp3,
  FROM dbtab1 AS a
  LEFT OUTER JOIN dbtab2 AS b
   ON a~comp1 = b~comp1
  WHERE ...
  INTO ...

Verwendung einer UNION: Daten aus mehreren Datenbanktabellen kombinieren. Die Spalten der Ergebnismenge behalten die in der Anweisung links von UNION definierten Namen. Die Ergebnismenge der Zeilen der SELECT-Anweisung rechts von UNION werden in die Ergebnismenge der SELECT-Anweisung links von UNION eingefügt.

SELECT FROM dbtab1
  FIELDS ...
  WHERE ...
UNION
  SELECT FROM dbtab2
   FIELDS ...
   WHERE ...
  INTO ...

Es sind auch weitere Join-Varianten verfügbar. Weitere Information ist in der ABAP-Schlüsselwortdokumentation über joins enthalten.

Verwendung von SELECT 5: Exkurse

Mit SELECT aus DDIC-Views oder CDS-Views lesen oder eine interne Tabelle als Datenquelle für das Lesen verwenden.

Siehe ausführbares Beispiel.

Daten in Datenbanktabellen ändern

Verwendung von INSERT

"Insert individual row into database table
INSERT dbtab FROM @row.
INSERT INTO dbtab VALUES row. "Alternative syntax.

"Insert multiple rows (from an internal table) into database table.
INSERT dbtab FROM TABLE @itab.

"Insert multiple rows accepting duplicate keys. All rows that would
"produce duplicate entries in the database table regarding the keys
"are discarded and sy-subrc is set to 4.
INSERT dbtab FROM TABLE @itab ACCEPTING DUPLICATE KEYS.

Verwendung von UPDATE

"Change content by overwriting entire rows from a work area
UPDATE dbtab FROM @row.

"Change content by overwriting entire rows from an internal table
UPDATE dbtab FROM TABLE @itab.

"Change content of specific columns without overwriting existing
"content of rows
UPDATE dbtab SET comp4 = 'XYZ' WHERE ... .

Verwendung von MODIFY

"Insert rows into database table or change existing rows
MODIFY dbtab FROM itab.

Verwendung von DELETE

"Delete table row from work area.
DELETE dbtab FROM row.

"Delete table rows by condition
DELETE FROM dbtab WHERE ... .

"Delete complete table
DELETE FROM dbtab.

Demonstrationsprogramm

Im Beispiel - Arbeiten mit persistierten Daten in Datenbanktabellen werden alle oben erwähnten syntaktischen Optionen in einem Programm demonstriert.






ABAP Short Reference   ROGBILLS - Synchronize billing plans  
Diese Dokumentation steht unter dem Copyright der SAP AG.

Length: 32868 Date: 20240523 Time: 150340     sap01-206 ( 363 ms )