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

Kurzreferenz

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:

In diesem Fall wird auf dem Applikationsserver auf die Daten der internen Tabelle zugegriffen, die dann wie eine Tabelle im Tabellenpuffer behandelt wird. Dies ist für alle Datenbankplattformen möglich.
In diesem Fall müssen die Daten vor der eigentlichen Ausführung der Query an temporäre Tabellen der Datenbank übergeben werden. Diese Möglichkeit wird nicht von allen Datenbanken unterstützt. Wenn statisch erkennbar ist, dass die Daten auf der Datenbank benötigt werden, kommt es zu einer durch das Pragma ##db_feature_mode[itabs_in_from_clause] ausblendbaren Warnung von der Syntaxprüfung. Wenn versucht wird, zur Laufzeit Daten der internen Tabelle an eine Datenbank zu übergeben, die dies nicht unterstützt, kommt es zu einer behandelbaren Ausnahme der Klasse CX_SY_SQL_UNSUPPORTED_FEATURE.

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 ).