SAP NetWeaver AS ABAP Release 750, ©Copyright 2016 SAP AG. Alle Rechte vorbehalten.
ABAP - Schlüsselwortdokumentation →
ABAP - Referenz →
Externe Daten verarbeiten →
ABAP-Datenbankzugriffe →
Open SQL →
Open SQL - Lesende Zugriffe →
SELECT →
SELECT - WHERE →
Kurzreferenz
WHERE - FOR ALL ENTRIES
Syntax
... FOR ALL ENTRIES IN itab WHERE ... col operator itab-comp ...
Wirkung
Wenn vor dem Sprachelement WHERE der Anweisung SELECT
der Zusatz FOR ALL ENTRIES angegeben ist, können die Komponenten
comp der dort angegebenen internen Tabelle itab innerhalb von sql_cond auf der linken Seite von Vergleichen einer
Spalte col mit
Vergleichsoperatoren verwendet werden. Die angegebene
Komponente comp muss zur Spalte col kompatibel
sein. Die interne Tabelle itab kann einen strukturierten oder einen elementaren Zeilentyp haben. Bei elementarem Zeilentyp ist für comp die
Pseudokomponente table_line anzugeben. Dem Namen der internen Tabelle soll wie allen
Hostvariablen das Fluchtsymbol @ vorangestellt werden.
Der gesamte logische Ausdruck sql_cond
wird für jede einzelne Zeile der internen Tabelle itab ausgewertet.
Die Ergebnismenge der SELECT-Anweisung ist die Vereinigungsmenge der Ergebnismengen,
die sich aus den einzelnen Auswertungen ergeben. Doppelt vorkommende Zeilen werden automatisch aus der
Ergebnismenge entfernt. Wenn die interne Tabelle itab leer ist, wird die
gesamte WHERE-Bedingung ignoriert und es werden alle Zeilen von der Datenbank in die Ergebnismenge gestellt.
Der logische Ausdruck sql_cond
der WHERE-Bedingung kann über AND und
OR aus verschiedenen logischen Ausdrücken zusammengesetzt sein. Wenn FOR ALL ENTRIES angegeben ist, muss es aber mindestens einen
Vergleich mit einer Spalte der internen Tabelle itab geben, der statisch oder dynamisch angegeben werden kann.
Bei Verwendung des Zusatzes FOR ALL ENTRIES gelten folgende Einschränkungen im Zusammenspiel mit anderen Zusätzen:
- Der Zusatz FOR ALL ENTRIES ist nur vor WHERE-Bedingungen der Anweisung SELECT möglich.
- Der Zusatz FOR ALL ENTRIES kann nicht zusammen mit dem Zusatz
SINGLE hinter SELECT verwendet werden.
- Der Zusatz FOR ALL ENTRIES kann nicht zusammen mit SQL-Ausdrücken verwendet werden.
- Wenn der Zusatz FOR ALL ENTRIES verwendet wird, dürfen in der
SELECT-Liste keine Datenbankfelder der eingebauten Typen STRING und RAWSTRING sowie LCHR und LRAW vorkommen. Dies führt im
strikten Modus ab Release 7.40, SP05
zu einem Syntaxfehler, ansonsten zu einer durch ein Pragma ausblendbaren Syntaxwarnung in der erweiterten Programmprüfung.
- Der Zusatz FOR ALL ENTRIES kann nicht zusammen mit UNION verwendet werden.
- Der Zusatz FOR ALL ENTRIES soll nicht zusammen mit dem Zusatz
GROUP BY verwendet werden. Der Zusatz GROUP BY hat bei Verwendung von FOR ALL ENTRIES keine Wirkung.
- In einer SELECT-Anweisung mit FOR ALL ENTRIES
kann der Zusatz ORDER BY
nur mit dem Zusatz PRIMARY KEY verwendet und dadurch nur auf eine einzige
Tabelle oder View zugegriffen werden. In der SELECT-Liste
müssen in diesem Fall alle Spalten des Primärschlüssels außer der Mandantenspalte mandantenabhängiger Tabellen enthalten sein.
- In einer SELECT-Anweisung mit FOR ALL ENTRIES können keine Pfadausdrücke verwendet werden.
Hinweise
- Hinter FOR ALL ENTRIES und hinter INTO kann die gleiche interne Tabelle angegeben werden. Der Inhalt der Tabelle wird von
FOR ALL ENTRIES ausgewertet und dann von der INTO-Klausel überschrieben.
- Der Vergleich mit einer Spalte der internen Tabelle kann auch in der WHERE-Bedingung einer
Subquery für die gleiche Datenquelle durchgeführt werden.
- Bezüglich doppelt vorkommender Zeilen in der Ergebnismenge wirkt der Zusatz FOR
ALL ENTRIES so, als sei der Zusatz DISTINCT
in der Definition der Selektionsmenge angegeben. Im Unterschied zu DISTINCT
werden die Zeilen aber nicht immer vom Datenbanksystem sondern unter Umständen erst auf dem Applikationsserver
aus der Ergebnismenge entfernt. Die doppelten Zeilen werden dann vom Datenbanksystem entfernt, wenn
die SELECT-Anweisung als eine einzige SQL-Anweisung an das Datenbanksystem
übergeben werden kann. Falls die SELECT-Anweisung auf mehrere SQL-Anweisungen verteilt übergeben werden muss, findet die Verdichtung auf dem Applikationsserver statt.
- Da in der SELECT-Liste
keine Datenbankfelder der Typen STRING und RAWSTRING sowie LCHR und LRAW möglich sind, wenn der
Zusatz DISTINCT angegeben
ist, dürfen diese Typen auch nicht zusammen mit FOR ALL ENTRIES angegeben werden, da sie die Ausführung der Anweisung auf dem Datenbanksystem verhindern.
- Der Zusatz FOR ALL ENTRIES umgeht die
SAP-Pufferung für
Tabellen mit generischer Pufferung, wenn die Bedingung hinter FOR ALL ENTRIES verhindert, dass genau ein generischer Bereich exakt spezifiziert wird.
-
In allen anderen Fällen wird die SAP-Pufferung verwendet und der Zusatz FOR ALL ENTRIES kann eine performantere Alternative für
Join-Ausdrücke darstellen.
- Wenn doppelte Zeilen erst auf dem Applikationsserver entfernt werden, werden in manchen Konstellationen
alle durch die WHERE-Bedingung spezifizierten Zeilen an eine interne Systemtabelle übergeben und in dieser verdichtet. Die
maximale Größe dieser Systemtabelle
ist wie die normaler interner Tabellen beschränkt. Insbesondere wird die Systemtabelle immer
benötigt, wenn gleichzeitig einer der Zusätze
PACKAGE SIZE oder UP
TO n ROWS verwendet wird. Diese wirken dann nicht auf die Menge der vom Datenbankserver an
den Applikationsserver übergebenen Zeilen, sondern werden erst für die Übergabe
der Zeilen von der Systemtabelle an den eigentlichen Zielbereich verwendet. Wenn die maximale Größe der internen Systemtabelle überschritten wird, kommt es zu einem Laufzeitfehler.
- Es wird dringend empfohlen, vor einer Verwendung einer internen Tabelle itab
hinter FOR ALL ENTRIES sicherzustellen, dass die interne Tabelle nicht initial
ist. Bei einer initialen internen Tabelle werden unabhängig von eventuellen weiteren Bedingungen
hinter WHERE alle Zeilen von der Datenbank gelesen, was in aller Regel nicht gewünscht ist.
Beispiel
Auslesen von Flugdaten für eine vorgegebene Abflugstadt. Die entsprechenden Fluggesellschaften
und Flugnummern werden zuerst in eine interne Tabelle entry_tab gestellt,
die in der WHERE-Bedingung der folgenden SELECT-Anweisung
ausgewertet wird. Diese Selektion könnte mit einem Join in der
FROM-Klausel auch in einer einzigen SELECT-Anweisung
erfolgen. Beachten sie, dass vor der Ausführung der SELECT-Anweisung
mit FOR ALL ENTRIES sichergestellt wird, dass die Tabelle entry_tab nicht initial ist.
DATA p_city TYPE spfli-cityfrom.
cl_demo_input=>request( CHANGING field = p_city ).
TYPES: BEGIN OF entry_tab_type,
carrid TYPE spfli-carrid,
connid TYPE spfli-connid,
END OF entry_tab_type.
TYPES: BEGIN OF result_tab_type,
carrid TYPE sflight-carrid,
connid TYPE sflight-connid,
fldate TYPE sflight-fldate,
END OF result_tab_type.
DATA: entry_tab TYPE TABLE OF entry_tab_type,
result_tab TYPE SORTED TABLE OF result_tab_type
WITH UNIQUE KEY carrid connid fldate.
SELECT carrid, connid
FROM spfli
WHERE cityfrom = @( to_upper( p_city ) )
INTO CORRESPONDING FIELDS OF TABLE @entry_tab.
IF entry_tab IS NOT INITIAL.
SELECT carrid, connid, fldate
FROM sflight
FOR ALL ENTRIES IN @entry_tab
WHERE carrid = @entry_tab-carrid AND
connid = @entry_tab-connid
ORDER BY PRIMARY KEY
INTO CORRESPONDING FIELDS OF TABLE @result_tab.
cl_demo_output=>display( result_tab ).
ENDIF.