ABAP - Schlüsselwortdokumentation →  ABAP - Referenz →  Externe Daten verarbeiten →  ABAP-Datenbankzugriffe →  Open SQL →  Open SQL - Lesende Zugriffe →  SELECT - clauses → 

SELECT - INTO, APPENDING

Kurzreferenz

Syntax

... { INTO
      { {[CORRESPONDING FIELDS OF] @wa}|(@dobj1, @dobj2, ...)} }
  | { INTO|APPENDING
         [CORRESPONDING FIELDS OF] TABLE @itab [PACKAGE SIZE n]}
  | { INTO @DATA(wa) }
  | { INTO TABLE @DATA(itab) [PACKAGE SIZE n] }
    [ EXTENDED RESULT @oref ]
    [ creating ] ...  .

Alternativen:

1. ... INTO [CORRESPONDING FIELDS OF] @wa

2. ... INTO (@dobj1, @dobj2, ... )

3. ... INTO|APPENDING [CORRESPONDING FIELDS OF] TABLE @itab [PACKAGE SIZE n]

4. ... INTO @DATA(wa)

5. ... INTO TABLE @DATA(itab) [PACKAGE SIZE n]

Wirkung

Die Angaben hinter INTO bzw. APPENDING legen fest, welchen Datenobjekten die Ergebnismenge einer SELECT-, WITH- oder FETCH-Anweisung zugewiesen wird. Es können

als Hostvariable mit vorangestellten Fluchtsymbol @ angegeben werden. Mit dem Deklarationsoperator DATA können entsprechende Inline-Deklarationen durchgeführt werden.

Wenn für den Arbeitsbereich, einzelne Datenobjekte oder interne Tabellen Feldsymbole oder dereferenzierte Referenzvariablen angegeben werden, wird bei einer mit ENDSELECT abgeschlossenen SELECT-Schleife genau einmal beim Eintritt in die Schleife bestimmt, auf welches Datenobjekt ein Feldsymbol oder eine Referenzvariable zeigt. Dieses Datenobjekt wird bei jedem Schleifendurchgang als Zielbereich verwendet. Eine Änderung der Zuordnung eines Feldsymbols oder einer Referenzvariable innerhalb der Schleife hat darauf keine Auswirkung.

Mit dem Zusatz EXTENDED RESULT kann ein erweitertes Ergebnis in einem Ergebnisobjekt zur Verfügung gestellt werden.

Wenn ein LOB der Ergebnismenge mit einem LOB-Handle verknüpft wird, muss eventuell mit creating festgelegt werden, ob es sich um einen Datenstrom oder einen Lokator handelt.

Hinweise

Alternative 1

... INTO [CORRESPONDING FIELDS OF] @wa


Wirkung

Für wa kann ein Datenobjekt als Hostvariable mit vorangestellten Fluchtsymbol @ angegeben werden, das ohne die Angabe von CORRESPONDING FIELDS OF bestimmten Voraussetzungen genügen muss. Wenn die Ergebnismenge einzeilig ist, wird diese Zeile wa zugewiesen. Ist die Ergebnismenge mehrzeilig, muss hinter SELECT eine ENDSELECT-Anweisung folgen und die Ergebnismenge wird zeilenweise an den Arbeitsbereich wa zugewiesen und kann in der Schleife ausgewertet werden. Hinter ENDSELECT enthält der Arbeitsbereich wa die zuletzt zugewiesene Zeile. Bei Verwendung in der Anweisung FETCH wird eine Zeile an der aktuellen Cursor-Position entnommen. Ist die Ergebnismenge leer, bleibt der Arbeitsbereich unverändert. Kommt es während des Befüllens des Arbeitsbereichs zu einer behandelbaren Ausnahme, ist sein Inhalt beim Behandeln der Ausnahme undefiniert.

Die Zuweisung der Zeilen der Ergebnismenge richtet sich wie folgt nach der SELECT-Liste:

Wenn mit * alle Spalten gelesen werden, CORRESPONDING FIELDS nicht angegeben ist und die SELECT-Anweisung nicht die Hauptquery einer WITH-Anweisung ist, verhält sich SELECT wie folgt:
Besteht die Ergebnismenge aus einer einzigen explizit hinter SELECT angegebenen Spalte, einem einzigen SQL-Ausdruck oder einem einzigen Aggregatausdruck, kann wa ein elementares Datenobjekt oder eine Struktur sein. Wenn die Ergebnismenge aus mehreren Spalten besteht, muss sie eine Struktur sein und es gilt Folgendes:

Für die einzelnen Zuweisungen gelten die Zuweisungsregeln. Wenn dabei ein LOB einer Referenzvariable für LOB-Handles zugewiesen wird, wird ein LOB-Handle erzeugt.

Bei der Verwendung von CORRESPONDING FIELDS müssen die Spalten der in der SELECT-Liste definierten Ergebnismenge zu den Komponenten des Zielbereichs passen. Unter anderem muss es mindestens eine Übereinstimmung geben oder für jede explizit aufgeführte Spalte muss es auch eine gleichnamige Komponente im Zielbereich geben.

Hinweise

Beispiel

Einlesen der vier Spalten einer Ergebnismenge in vier jeweils namensgleiche Komponenten eines Arbeitsbereichs, die dort in einer anderen Reihenfolge vorliegen.

DATA:
  BEGIN OF wa,
    cityfrom TYPE spfli-cityfrom,
    cityto   TYPE spfli-cityto,
    carrid   TYPE spfli-carrid,
    connid   TYPE spfli-connid,
  END OF wa.

SELECT SINGLE
       FROM spfli
       FIELDS carrid, connid, cityfrom, cityto
       WHERE carrid = 'LH' AND connid = '400'
       INTO CORRESPONDING FIELDS OF @wa.
cl_demo_output=>display( wa ).

Alternative 2

... INTO (@dobj1, @dobj2, ... )


Wirkung

Besteht die Ergebnismenge aus mehreren explizit in der SELECT-Liste angegebenen Spaltenangaben col_spec, kann hinter INTO eine eingeklammerte und durch Kommata getrennte Liste von Datenobjekten dobj1, dobj2, ... angegeben werden. Als einzelnes Datenobjekt ist möglich:

Es müssen genauso viele Datenobjekte dobj angegeben werden, wie die Ergebnismenge Spalten enthält. Der Inhalt der Spalten in der Ergebnismenge wird gemäß der hinter SELECT festgelegten Reihenfolge von links nach rechts den Datenobjekten zugewiesen. Die einzelnen Zuweisungen erfolgen nach den Zuweisungsregeln. Wenn dabei ein LOB einer Referenzvariable für LOB-Handles zugewiesen wird, wird ein LOB-Handle erzeugt. Ist die Ergebnismenge leer, bleiben die Datenobjekte unverändert. Kommt es während des Befüllens der Datenobjekte zu einer behandelbaren Ausnahme, ist ihr Inhalt beim Behandeln der Ausnahme undefiniert.

Wenn die Ergebnismenge einzeilig ist, werden die Spalten dieser Zeile zugewiesen. Bei einer mehrzeiligen Ergebnismenge muss hinter SELECT eine ENDSELECT-Anweisung folgen und die Spalten der Ergebnismenge werden zeilenweise den Datenobjekten zugewiesen und können in der Schleife ausgewertet werden. Bei Verwendung in der Anweisung FETCH werden die Spalten der Zeile an der aktuellen Cursor-Position entnommen.

Hinweis

Hinter INTO kann keine Liste angegeben werden, wenn die Ergebnismenge über die Angabe von * oder data_source~* in der SELECT-Liste definiert wird.

Beispiel

Einlesen der vier Spalten einer Ergebnismenge in vier einzeln angegebene Komponenten einer Struktur. Im Vergleich zum vorhergehenden Beispiel entfällt hier der Namensvergleich durch die Laufzeitumgebung.

DATA:
  BEGIN OF wa,
    cityfrom TYPE spfli-cityfrom,
    cityto   TYPE spfli-cityto,
    carrid   TYPE spfli-carrid,
    connid   TYPE spfli-connid,
  END OF wa.

SELECT SINGLE
       FROM spfli
       FIELDS carrid, connid, cityfrom, cityto
       WHERE carrid = 'LH' AND connid = '400'
       INTO (@wa-carrid,
             @wa-connid,
             @wa-cityfrom,
             @wa-cityto).

cl_demo_output=>display( wa ).

Beispiel

Auslesen der vier Spalten einer Ergebnismenge mit Inline-Deklarationen für die einzelnen Zielobjekte.

SELECT SINGLE
       FROM spfli
       FIELDS carrid, connid, cityfrom, cityto
       WHERE carrid = 'LH' AND connid = '400'
       INTO (@DATA(carrid),
             @DATA(connid),
             @DATA(cityfrom),
             @DATA(cityto)).
cl_demo_output=>display(
  |{ carrid } { connid } { cityfrom } { cityto }| ).

Alternative 3

... INTO|APPENDING [CORRESPONDING FIELDS OF] TABLE @itab [PACKAGE SIZE n]


Zusatz:

... PACKAGE SIZE n

Wirkung

Wenn die Ergebnismenge mehrzeilig ist, kann hinter INTO TABLE oder hinter APPENDING TABLE eine interne Tabelle itab beliebiger Tabellenart als Hostvariable mit vorangestellten Fluchtsymbol @ angegeben werden, deren Zeilentyp den Voraussetzungen genügt.

Die Ergebnismenge wird Zeile für Zeile nach den Regeln von INSERT in die interne Tabelle itab eingefügt, wobei bei einer sortierten Tabelle eine Sortierung vorgenommen wird.

Wenn es zu einem Konflikt mit einem bereits vorhandenen eindeutigen Tabellenschlüssel kommt, führt dies wie bei INSERT LINES OF zu einer unbehandelbaren Ausnahme.

Vor jeder Zuweisung einer Zeile der Ergebnismenge wird eine initiale Zeile der internen Tabelle itab erzeugt und dieser wird die Zeile der Ergebnismenge zugewiesen. Für die Zuweisung einer Zeile der Ergebnismenge an eine Zeile der internen Tabelle mit und ohne CORRESPONDING FIELDS gelten die gleichen Regeln wie bei der Zuweisung an einen einzelnen Arbeitsbereich wa (siehe oben) mit der Ausnahme, dass beim Einfügen in interne Tabellen LOB-Handles zwar als Lokatoren aber nicht als Leseströme erzeugt werden können.

Fehlt der Zusatz PACKAGE SIZE, werden alle Zeilen der Ergebnismenge in die interne Tabelle itab eingefügt und die Anweisung ENDSELECT darf nicht hinter SELECT angegeben werden.

Ist die Ergebnismenge leer, wird die interne Tabelle bei Verwendung von INTO initialisiert und bleibt bei Verwendung von APPENDING unverändert. Kommt es während des Befüllens der internen Tabelle zu einer behandelbaren Ausnahme, ist ihr Inhalt beim Behandeln der Ausnahme undefiniert.

Hinweise

Beispiel

Einlesen der vier Spalten einer Ergebnismenge in vier jeweils namensgleiche Komponenten einer internen Tabelle, die dort in einer anderen Reihenfolge vorliegen.

TYPES:
  BEGIN OF wa,
    cityfrom TYPE spfli-cityfrom,
    cityto   TYPE spfli-cityto,
    carrid   TYPE spfli-carrid,
    connid   TYPE spfli-connid,
  END OF wa.

DATA itab TYPE SORTED TABLE OF wa WITH UNIQUE KEY table_line.

SELECT FROM spfli
       FIELDS carrid, connid, cityfrom, cityto
       INTO CORRESPONDING FIELDS OF TABLE @itab.
cl_demo_output=>display( itab ).

Beispiel

Das folgende Beispiel zu APPENDING TABLE erzeugt die gleiche interne Tabelle wie das Beispiel zu UNION.

SELECT FROM scarr
       FIELDS carrname,
              CAST( '-' AS CHAR( 4  ) ) AS connid,
              CAST( '-' AS CHAR( 20 ) ) AS cityfrom,
              CAST( '-' AS CHAR( 20 ) ) AS cityto
       WHERE carrid = 'LH'
       INTO TABLE @DATA(result).

SELECT FROM spfli
       FIELDS '-' AS carrname,
             connid,
             cityfrom,
             cityto
          WHERE carrid = 'LH'
          APPENDING TABLE @result.

SORT result BY carrname DESCENDING connid cityfrom cityto.

cl_demo_output=>display( result ).

Zusatz

... PACKAGE SIZE n

Wirkung

Durch Angabe des Zusatzes PACKAGE SIZE werden die Zeilen der Ergebnismenge bei SELECT in einer Schleife verarbeitet, die mit ENDSELECT abgeschlossen werden muss. Sie werden in Paketen von n Zeilen in die interne Tabelle itab eingefügt. Für n wird eine Hostvariable mit vorangestellten Fluchtsymbol @, ein Hostausdruck oder ein Literal vom Typ i erwartet, welche die Anzahl der Zeilen enthalten. Bei der Angabe von n als Datenobjekt soll das Fluchtsymbol @ vorangestellt werden. Der Inhalt von n muss gemäß der Regeln für eine verlustfreie Zuweisung zum Datentyp i passen. Im strikten Modus der Syntaxprüfung zu Release 7.51 muss n vom Typ b, s, i oder int8 sein. Falls der Inhalt von n kleiner 0 ist, kommt es zu einer unbehandelbaren Ausnahme. Falls der Inhalt von n gleich 0 ist, werden alle Zeilen der Ergebnismenge in die interne Tabelle itab eingefügt. Bei Verwendung in der Anweisung FETCH werden n Zeilen ab der aktuellen Cursor-Position entnommen.

Bei der Verwendung von INTO wird die interne Tabelle vor jedem Einfügen initialisiert und sie enthält in einer SELECT-Schleife nur die Zeilen des aktuellen Pakets. Bei Verwendung von APPENDING wird bei jeder SELECT-Schleife bzw. bei jeder Entnahme mit FETCH ein weiteres Paket zu den vorhandenen Zeilen der internen Tabelle hinzugefügt.

Hinter ENDSELECT ist der Inhalt von itab bei der Verwendung von INTO undefiniert, d.h., die Tabelle kann entweder die Zeilen des letzten Pakets enthalten oder initial sein. Bei Verwendung von APPENDING behält der Inhalt von itab den Zustand des letzten Schleifendurchgangs bei.

Hinweise

Beispiel

Auslesen und Ausgabe von Spalten der Datenbanktabelle SPFLI in Paketen von zehn Zeilen.

DATA(out) = cl_demo_output=>new( ).
SELECT carrid, connid, cityfrom, cityto
       FROM spfli
       ORDER BY carrid, connid, cityfrom, cityto
       INTO  TABLE @DATA(result) PACKAGE SIZE 10.
  out->next_section( |Package { sy-dbcnt / 10 }|
    )->write( result ).
ENDSELECT.
out->display( ).

Alternative 4

... INTO @DATA(wa)


Alternative 5

... INTO TABLE @DATA(itab) [PACKAGE SIZE n]


Wirkung

Inline-Deklaration des gesamten Zielbereichs. Dem Deklarationsoperator DATA muss das Fluchtsymbol @ vorangestellt werden. Der Datentyp des erzeugten Datenobjekts wird gemäß der Struktur der hinter SELECT definierten Ergebnismenge und der Anzahl der hinter FROM angegebenen Datenquellen konstruiert. Bei INTO @DATA(wa) wird ein flaches Datenobjekt wa dieses Typs, bei INTO TABLE @DATA(itab) wird eine Standardtabelle itab dieses Zeilentyps mit leerem Tabellenschlüssel deklariert. Für PACKAGE SIZE gilt das Gleiche wie bei der Angabe einer vorhandenen internen Tabelle.

Voraussetzungen für eine Inline-Deklaration sind:

Der Datentyp des deklarierten Datenobjekts wa bzw. itab wird wie folgt bestimmt:

Der elementare Datentyp eines elementaren Datenobjekts bzw. einer elementaren Komponente einer Struktur wird wie folgt konstruiert:

Die Namen der elementaren Komponenten einer Struktur entsprechen denen der zugehörigen Spalten aus der Ergebnismenge, wobei die dort definierte Aliasnamen berücksichtigt werden.

Hinweise

Beispiel

Einlesen von Spalten einer einzelnen Zeile in einen inline deklarierten Arbeitsbereich.

SELECT SINGLE
       FROM scarr
       FIELDS carrname,
              carrid,
              url
       WHERE carrid = 'LH'
       INTO @DATA(result).

cl_demo_output=>display( result ).

Beispiel

Einlesen aller Spalten der Ergebnismenge eines inneren Joins in eine interne Tabelle, deren Zeilentyp inline als geschachtelte Struktur mit dem gleichen Aufbau wie die Ergebnismenge deklariert wird. Die erste Komponente der geschachtelten Struktur heißt SCARR und umfasst alle Spalten dieser Datenbanktabelle. Die zweite Komponente der geschachtelten Struktur heißt SPFLI und umfasst alle Spalten dieser Datenbanktabelle. Der Inhalt der Spalten MANDT und CARRID beider Tabellen ist redundant vorhanden. Für die Ausgabe wird die interne Tabelle mit geschachteltem Zeilentyp in eine Ausgabetabelle ohne Unterstrukturen konvertiert.

TYPES BEGIN OF output_wa.
INCLUDE TYPE scarr AS scarr RENAMING WITH SUFFIX _scarr.
INCLUDE TYPE spfli AS spfli RENAMING WITH SUFFIX _spfli.
TYPES END OF output_wa.
TYPES output TYPE SORTED TABLE OF output_wa
             WITH NON-UNIQUE KEY carrid_scarr connid_spfli.

SELECT *
       FROM scarr
         INNER JOIN spfli ON scarr~carrid = spfli~carrid
       INTO TABLE @DATA(itab).

cl_demo_output=>display( CONV output( itab ) ).

Ausführbares Beispiel

Inline-Deklarationen



Weiterlesen
SELECT - EXTENDED RESULT
SELECT - Zuweisungsregeln
SELECT - LOB-Handles
Example SELECT, Inline-Deklarationen