
DieINTO -Klausel definiert den Zielbereich, in den die Selektion der SELECT -Klausel geschrieben wird. Als Zielbereich kommen Variablen in Frage, deren Datentyp kompatibel oder zumindest konvertibel zur Selektion der SELECT -Klausel sein muss.
DieSELECT -Klausel bestimmt den Datentyp des Zielbereichs wie folgt:
Bei der Selektion einer einzelnen Zeile muss der Zielbereich flach sein. Bei der Selektion mehrerer Zeilen kann der Zielbereich tabellenartig oder flach sein. Bei flachem Zielbereich muss dann eineSELECT -Schleife ausgeführt werden.
Bei der Selektion aller Spalten muss der Zielbereich eine Struktur oder dazu konvertibel sein. Bei der Selektion einzelner Spalten kann der Zielbereich eine Komponente einer Struktur oder ein Einzelfeld sein.
Die elementaren Datentypen in der Selektion derSELECT -Klausel sind Dictionary Typen. Die Dictionary Typen müssen in die ABAP Datentypen der entsprechenden elementaren Komponenten des Zielbereichs konvertierbar sein. Eine entsprechende Tabelle findet sich unter Datentypen im ABAP Dictionary .
Flachen Arbeitsbereich angeben
Um einen flachen Arbeitsbereich als Zielbereich anzugeben, schreibt man für die INTO -Klausel:
SELECT ... INTO [CORRESPONDING FIELDS OF] wa ...
wa
Bei strukturierten Arbeitsbereichen kann der ZusatzCORRESPONDING FIELDS eingesetzt werden. Mit dem Zusatz werden nur die Inhalte namensgleicher Felder komponentenweise von der Selektion dem Arbeitsbereich zugewiesen. Dabei werden eventuelle alternative Spaltennamen der Selektion berücksichtigt.
Interne Tabellen angeben
Um eine interne Tabelle als Zielbereich anzugeben, schreibt man für die INTO -Klausel:
SELECT ... INTO|APPENDING [CORRESPONDING FIELDS OF] TABLE itab
[PACKAGE SIZE n] ...
Die interne Tabelle wird mit allen Zeilen der Selektion gefüllt. Dabei werden bei Verwendung vonINTO alle bereits vorhandenen Zeilen gelöscht und bei Verwendung vonAPPENDING die neuen Zeilen in die bereits vorhandenen Zeilen eingefügt.
Mit dem ZusatzPACKAGE SIZE werden die Zeilen der Selektion nicht auf einmal, sondern paketweise in die interne Tabelle geschrieben. Es können Pakete von n Zeilen definiert werden, die eines nach dem anderen in die Tabelle geschrieben werden.
Einzelfelder angeben
Falls in derSELECT INTO -Klausel einzelne Spalten oder Aggregatausdrücke als Spaltenangabe gemacht sind, können Einzelfelder beim Lesen von Einzelzeilen oder beim Lesen mehrerer Zeilen in einerSELECT -Schleife angegeben werden. Um Einzelfelder als Zielbereich anzugeben, schreibt man für die INTO -Klausel:
SELECT ... INTO (f1, f2, ...) ...
Es müssen genau so viele Einzelfelder f 1 , f 2 , …angegeben werden, wie die Liste in derSELECT -Klausel an Spalten und Aggregatausdrücken enthält. Die Felder derSELECT -Klausel werden von links nach rechts den Einzelfeldern derINTO -Klausel zugewiesen.
Flache Strukturen als Zielbereich
DATA wa TYPE spfli. SELECT * INTO wa FROM spfli. WRITE: / wa-carrid... ENDSELECT.
Es wird eine flache Struktur des gleichen Datentyps wie die Datenbanktabelle SPFLI als Zielbereich einerSELECT -Schleife verwendet. Innerhalb der Schleife kann typgerecht auf den Inhalt der einzelnen Spalten zu gegriffen werden.
DATA spfli TYPE spfli. SELECT * FROM spfli. WRITE: / spfli-carrid... ENDSELECT.
Es wird eine Strukturspfli deklariert, die den gleichen Namen wie die zu lesende Datenbanktabelle hat. In derSELECT -Schleife wird implizit diese Struktur als Zielbereich verwendet. Hier besteht die Gefahr, zu übersehen, dass in der Schleife ein ABAP-Datenobjekt verarbeitet wird und nicht die Datenbank selbst.
Interne Tabelle als Zielbereich
REPORT demo_select_into_table. DATA: BEGIN OF wa, carrid TYPE spfli-carrid, connid TYPE spfli-connid, cityfrom TYPE spfli-cityfrom, cityto TYPE spfli-cityto, END OF wa, itab LIKE SORTED TABLE OF wa WITH NON-UNIQUE KEY cityfrom cityto. SELECT carrid connid cityfrom cityto INTO CORRESPONDING FIELDS OF TABLE itab FROM spfli. IF sy-subrc EQ 0. WRITE: / sy-dbcnt, 'Connections'. SKIP. LOOP AT itab INTO wa. WRITE: / wa-carrid, wa-connid, wa-cityfrom, wa-cityto. ENDLOOP. ENDIF.
Die Listenausgabe ist:
Es wird eine sortierte Tabelleitab , die vier Felder mit gleichem Namen und gleichem Datentyp wie die Datenbanktabelle SPFLI hat als Zielbereich verwendet. Durch den ZusatzCORRESPONDING FIELDS werden die Spalten derSELECT -Klausel in die richtigen Felder der Tabelle übertragen und gleichzeitig nach dem Tabellenschlüssel vonitab sortiert.
Einlesen von Paketen in interne Tabellen
REPORT demo_select_into_package. DATA: wa TYPE spfli, itab TYPE SORTED TABLE OF spfli WITH UNIQUE KEY carrid connid. SELECT carrid connid FROM spfli INTO CORRESPONDING FIELDS OF TABLE itab PACKAGE SIZE 3. LOOP AT itab INTO wa. WRITE: / wa-carrid, wa-connid. ENDLOOP. SKIP 1. ENDSELECT.
Die Listenausgabe ist:
Es werden Pakete von je 3 Zeilen in die sortierte Tabelleitab gelesen. Innerhalb jedes Durchgangs derSELECT -Schleife hat die interne Tabelle einen anderen sortierten Inhalt.
Bei Verwendung vonAPPENDING stattINTO sähe die Listenausgabe übrigens so aus:
Bei jedem Schleifendurchgang wird ein weiteres Paket in die interne Tabelle einsortiert.
Einzelfelder als Zielbereich.
REPORT demo_select_single_fields. DATA: average TYPE p DECIMALS 2, sum TYPE p DECIMALS 2. SELECT AVG( luggweight ) SUM( luggweight ) INTO (average, sum) FROM sbook. WRITE: / 'Average:', average, / 'Sum :', sum.
Die Listenausgabe ist:
In derSELECT -Klausel sind zwei Aggregatausdrücke zur Berechnung von Durchschnittswert und Summe der Felder LUGGWEIGHT in der Datenbanktabelle SBOOK angegeben. Die beiden Felderaverage undsum werden als Zielbereich verwendet.
Alternativnamen verwenden.
REPORT demo_select_as. DATA: BEGIN OF luggage, average TYPE p DECIMALS 2, sum TYPE p DECIMALS 2, END OF luggage. SELECT AVG( luggweight ) AS average SUM( luggweight ) AS sum INTO CORRESPONDING FIELDS OF luggage FROM sbook. WRITE: / 'Average:', luggage-average, / 'Sum :', luggage-sum.
Die Listenausgabe ist:
Das Beispiel hat die gleiche Funktionalität wie vorhergehendes, nur dass hier statt einer Liste von Einzelfeldern eine Struktur als Zielbereich angegeben wird und dass die Namen der Strukturkomponenten als Alternativnamen in der SELECT -Klausel verwendet werden.