SAP NetWeaver AS ABAP Release 752, ©Copyright 2017 SAP AG. Alle Rechte vorbehalten.
ABAP - Schlüsselwortdokumentation → ABAP - Referenz → Externe Daten verarbeiten → ABAP-Datenbankzugriffe → Open SQL → Open SQL - Lesende Zugriffe → SELECT - clauses → SELECT - FROM → SELECT - data_source →
SELECT - FROM @itab
Syntax
... @itab
Wirkung
Angabe einer internen Tabelle itab, deren Bezeichner das Zeichen @ vorangestellt sein muss, als Datenquelle einer Query. Die SELECT-Anweisung behandelt die interne Tabelle des Applikationsservers wie eine Datenbanktabelle auf der Datenbank. Die ABAP-Typen der Spalten der internen Tabelle werden auf passende eingebaute Datentypen des ABAP Dictionary abgebildet. Wenn eine Spalte mit Bezug auf einen Typ im ABAP Dictionary deklariert ist, wird direkt dieser Typ verwendet.
Es sind zwei Fälle zu unterscheiden:
Die Daten der internen Tabelle müssen genau dann nicht an die Datenbank übergeben werden, bzw. die Anweisung kann dann auf dem Applikationsserver ausgeführt werden, wenn die SELECT-Anweisung die gleichen Bedingungen wie für einen Zugriff auf den Tabellenpuffer der Tabellenpufferung erfüllt.
Die ABAP-Typen der Spalten der internen Tabelle werden auf Typen des ABAP Dictionary abgebildet. Wenn eine Spalte mit Bezug auf einen Typ im ABAP Dictionary deklariert ist, wird direkt dieser Typ verwendet.
Es gelten folgende Voraussetzungen:
Die Daten der internen Tabelle werden auch ohne Transport zur Datenbank wie auf der Datenbank behandelt. Insbesondere werden Daten vom Typ string, die durch Bezug auf den eingebauten Dictionary-Typ SSTRING deklariert sind wie Textfelder fester Länge behandelt, bei denen schließende Leerzeichen nicht berücksichtigt werden.
Die interne Tabelle itab wird immer als mandantenunabhängige Tabelle betrachtet. Der Datentyp der ersten Spalte wird unabhängig von ihrem Datentyp nie als Mandantenspalte betrachtet.
Hinweise
Beispiel
Verwendung einer Tabelle von Zufallszahlen als Datenquelle einer SELECT-Anweisung. Die Daten werden wegen der Sortierung zur Datenbank transportiert und die Anweisung kann nur auf Datenbanksystemen ausgeführt werden, welche dies unterstützen.
TYPES:
BEGIN OF line,
id TYPE c LENGTH 1,
number TYPE i,
END OF line.
DATA itab TYPE HASHED TABLE OF line
WITH UNIQUE KEY id.
IF NOT cl_abap_dbfeatures=>use_features(
EXPORTING
requested_features =
VALUE #( ( cl_abap_dbfeatures=>itabs_in_from_clause ) ) ).
cl_demo_output=>display(
`System does not support internal tables as data source` ).
RETURN.
ENDIF.
DATA(rnd) = cl_abap_random_int=>create(
seed = CONV i( sy-uzeit ) min = 1 max = 100 ).
itab = VALUE #(
FOR i = 1 UNTIL i > 25
( id = substring( val = sy-abcde off = i len = 1 )
number = rnd->get_next( ) ) ).
SELECT *
FROM @itab AS numbers
WHERE number > 50
ORDER BY id
INTO TABLE @DATA(result)
##db_feature_mode[itabs_in_from_clause].
cl_demo_output=>display( result ).
Beispiel
Verwendung einer internen Tabelle als Datenquelle eines inneren Joins einer SELECT-Anweisung. Die Daten werden wegen des Joins zur Datenbank transportiert und die Anweisung kann nur auf Datenbanksystemen ausgeführt werden, welche dies unterstützen.
DATA itab TYPE HASHED TABLE OF scarr
WITH UNIQUE KEY mandt carrid.
IF NOT cl_abap_dbfeatures=>use_features(
EXPORTING
requested_features =
VALUE #( ( cl_abap_dbfeatures=>itabs_in_from_clause ) ) ).
cl_demo_output=>display(
`System does not support internal tables as data source` ).
RETURN.
ENDIF.
itab = VALUE #( ( carrid = 'LH' carrname = 'L.H.' )
( carrid = 'UA' carrname = 'U.A.' ) ).
SELECT scarr~carrid, scarr~carrname, spfli~connid
FROM @itab AS scarr
INNER JOIN spfli ON scarr~carrid = spfli~carrid
INTO TABLE @DATA(result)
##db_feature_mode[itabs_in_from_clause].
cl_demo_output=>display( result ).
Beispiel
Verwendung einer Tabelle mit elementarem Datentyp als Datenquelle zweier SELECT-Anweisungen. Die Daten werden nicht auf der Datenbank benötigt und die SELECT-Anweisungen genügen den Anforderungen für eine Tabellenpufferung. Deshalb können die Anweisungen auf allen Datenbanksystemen ausgeführt werden. In der zweiten SELECT-Anweisung würde es ohne den alternativen Spaltennamen number zu einem Syntaxfehler kommen, da die Inline-Deklaration hinter INTO keine interne Tabelle mit dem Spaltennamen table_line anlegen darf. Wenn die Anweisungen so geändert würden, dass sie Anforderungen für eine Tabellenpufferung nicht erfüllen würden, beispielsweise durch Hinzufügen des Zusatzes DISTINCT, könnten sie nicht auf allen Datenbanksystemen ausgeführt werden.
DATA itab TYPE SORTED TABLE OF i WITH UNIQUE KEY table_line.
itab = VALUE #( ( 1 )
( 2 )
( 3 ) ).
DATA result1 LIKE itab.
SELECT table_line
FROM @itab AS numbers
INTO TABLE @result1.
cl_demo_output=>write( result1 ).
SELECT table_line AS number
FROM @itab AS numbers
INTO TABLE @DATA(result2).
cl_demo_output=>display( result2 ).