Ansicht
Dokumentation

ABENWHERE_ALL_ENTRIES - WHERE ALL ENTRIES

ABENWHERE_ALL_ENTRIES - WHERE ALL ENTRIES

RFUMSV00 - Advance Return for Tax on Sales/Purchases   General Material Data  
Diese Dokumentation steht unter dem Copyright der SAP AG.
SAP E-Book

Kurzreferenz

SELECT, FOR ALL ENTRIES

... FOR ALL ENTRIES IN @itab WHERE ... col operator @itab-comp ...

Wirkung

Wenn vor dem Sprachelement WHERE der Anweisung SELECT einer Hauptquery der Zusatz FOR ALL ENTRIES angegeben ist, können die Komponenten comp der dort als Hostvariable angegebenen internen Tabelle itab in relationalen Ausdrücken innerhalb von sql_cond auf der rechten Seite eines Vergleichsoperators in Vergleichen mit einer Spalte col 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.

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. Zeilen, die mehrfach vorkommen, werden automatisch aus der Ergebnismenge entfernt. Der gesamte Zeileninhalt wird hierfür betrachtet.

Wenn die interne Tabelle itab leer ist, wird die gesamte WHERE-Bedingung ignoriert. D.h. es werden alle Zeilen der Datenbanktabelle berücksichtigt und nach Entfernung der mehrfach vorkommenden Zeilen in die Ergebnismenge gestellt.

Der logische Ausdruck sql_cond der WHERE-Bedingung kann über AND und OR aus verschiedenen relationalen 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 einer eigenständigen SELECT-Anweisung oder in der Hauptquery hinter OPEN CURSOR möglich, wenn dort keine allgemeinen Tabellenausdrücke mit WITH definiert werden.
  • Der Zusatz FOR ALL ENTRIES kann nicht zusammen mit dem Zusatz SINGLE verwendet werden.
  • Der Zusatz FOR ALL ENTRIES kann nicht zusammen mit SQL-Ausdrücken außer einzeln angegebenen Spalten oder einem einzeln angegebenen Aggregatausdruck COUNT( * ) verwendet werden.
  • In einer SELECT-Anweisung mit FOR ALL ENTRIES können in der SELECT-Liste keine Aggregatausdrücke außer COUNT( * ) verwendet werden. Die Auswertung des Aggregatausdrucks erfolgt in diesen Fällen aber nicht auf der Datenbank sondern wird auf dem AS ABAP emuliert.
  • 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.
  • Wenn der Zusatz FOR ALL ENTRIES verwendet wird, sollten in der SELECT-Liste keine Datenbankfelder der eingebauten Typen STRING, RAWSTRING und GEOM_EWKB sowie LCHR und LRAW vorkommen. Diese Datentypen verhindern das Entfernen mehrfach vorkommender Zeilen auf dem Datenbanksystem. Die Zeilen werden erst auf dem AS ABAP aus der Ergebnismenge entfernt . Die Angabe solcher Felder in der SELECT-Liste führt zu einer durch ein Pragma ausblendbaren Warnung von der Syntaxprüfung.

Die interne Tabelle itab wird einmal pro Query ausgewertet. Eine Änderung des Inhalts der internen Tabelle in einer SELECT- oder WITH-Schleife hat keinen Einfluss auf den logischen Ausdruck.

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 mehrfach 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 nur auf dem AS ABAP aus der Ergebnismenge entfernt. Die mehrfachen Zeilen werden dann vom Datenbanksystem entfernt, wenn die SELECT-Anweisung als eine einzige SQL-Anweisung an das Datenbanksystem übergeben werden kann und dabei der Zusatz DISTINCT unterstützt wird. Falls die SELECT-Anweisung auf mehrere SQL-Anweisungen verteilt übergeben werden muss oder wenn Spalten der Typen STRING und RAWSTRING sowie LCHR und LRAW in der SELECT-Liste angegeben sind, findet die Verdichtung auf dem AS ABAP statt.
  • Wenn mehrfache Zeilen nur aus dem AS ABAP 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, OFFSET verwendet wird. Diese wirken dann nicht auf die Menge der vom Datenbankserver an den AS ABAP ü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.
  • Wenn der Spaltentyp es zulässt, kann der Zusatz DISTINCT zusammen mit FOR ALL ENTRIES verwendet werden, um das Verhalten explizit auszudrücken.
  • Der Zusatz FOR ALL ENTRIES umgeht die Tabellenpufferung 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 Tabellenpufferung verwendet und der Zusatz FOR ALL ENTRIES kann eine performantere Alternative für Join-Ausdrücke darstellen.
  • 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.
  • Dass bei leerer interner Tabelle itab die gesamte WHERE-Bedingung ignoriert wird, betrifft bei impliziter Mandantenbehandlung nicht die implizite WHERE-Bedingung für den aktuellen oder die mit USING CLIENT angegebenen Mandanten. Es werden also nur alle Daten des aktuellen Mandanten gelesen. Wenn die implizite Mandantenbehandlung mit dem obsoleten Zusatz CLIENT SPECIFIED abgeschaltet wird, gibt es keine implizite WHERE-Bedingung für den Mandanten. Eine dann explizit für die Mandantenspalte angegebene WHERE-Bedingung wird bei leerer interner Tabelle itab mit der gesamten Bedingung ignoriert und es werden die Daten aller Mandanten gelesen.
  • Wenn FOR ALL ENTRIES in einem strikten Modus der Syntaxprüfung zusammen mit Spalten der Typen STRING und RAWSTRING sowie LCHR und LRAW in der SELECT-Liste angegeben wird, wird die Syntaxprüfung im strikten Modus ab Release ausgeführt.
  • Es hängt von der Datenbankplattform und von den verschiedenen Einstellungen ab, wie die Inhalte der internen Tabellen and die Datenbank übergeben werden und wo sie in Konditionen umgewandelt werden. Wenn der FDA-Schreibzugriff verfügbar ist, kann er von FOR ALL ENTRIES verwendet werden.

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. Der Zusatz DISTINCT wird verwendet, um das implizite Verhalten explizit auszudrücken.

Beispiel

Verwendung von FOR ALL ENTRIES mit leerer interner Tabelle. Es werden alle Zeilen der DDIC-Datenbanktabelle gelesen. Die Anzahl gelesener Zeilen ist in der zweiten SELECT-Anweisung meist kleiner als in der ersten Anweisung. Dies liegt daran, dass nur eine Spalte gelesen wird und daher mehr doppelte Zeilen entfernt werden können. Die erste SELECT-Anweisung liest dagegen alle Zeilen der DDIC-Datenbanktabelle in die Ergebnismenge, da deren Struktur den gesamten Tabellenschlüssel abdeckt.






PERFORM Short Reference   CPI1466 during Backup  
Diese Dokumentation steht unter dem Copyright der SAP AG.

Length: 15142 Date: 20240523 Time: 113511     sap01-206 ( 276 ms )