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

SELECT

Kurzreferenz

Syntax

SELECT mainquery_clauses
  [UNION ...]
  INTO|APPENDING target
  [UP TO ...] [OFFSET ...]
  [abap_options].
  ...
[ENDSELECT].


Wirkung

Verwendung der Open-SQL-Anweisung SELECT als eigenständige Anweisung. Diese Anweisung liest Daten aus einer oder mehreren Datenbanktabellen, klassischen Views oder CDS-Entitäten und erzeugt daraus entweder eine mehrzeilige oder eine einzeilige Ergebnismenge und weist diese an geeignete ABAP-Datenobjekte zu.

Die Zusätze mainquery_clauses definieren, welche Daten in welcher Form von der Datenbank gelesen werden. Um die Ergebnismengen mehrerer Queries zu kombinieren, kann das Sprachelement UNION verwendet werden. Dabei gelten spezielle Regeln query_clauses für die Angabe der Klauseln. Abschließend werden folgende Eigenschaften definiert:

In der INTO-Klausel werden hinter INTO oder APPENDING die Datenobjekte target angegeben, denen die Ergebnismenge zeilenweise oder paketweise zugewiesen wird.
Die Zusätze UP TO, OFFSET bestimmen die Anzahl der zu lesenden Zeilen.
Optionale Zusätze abap_options legen fest, ob die Tabellenpufferung umgangen wird und definieren die Datenbankverbindung.

In den folgenden Fällen öffnet die Anweisung SELECT eine Schleife, die durch ENDSELECT abgeschlossen werden muss:

Bei jedem Schleifendurchgang weist die SELECT-Anweisung eine Zeile bzw. ein Paket von Zeilen den in target angegebenen Datenobjekten zu. Wenn die letzte Zeile zugewiesen wurde oder die Ergebnismenge leer ist, verzweigt SELECT zu ENDSELECT. Für die Verarbeitung einer SELECT-Schleife wird implizit ein Datenbank-Cursor geöffnet und bei Beendigung der Schleife wieder geschlossen. In einem Programm dürfen Über die Open-SQL-Schnittstelle maximal 17 Datenbank-Cursor gleichzeitig geöffnet sein. Beim Versuch, mehr als 17 Datenbank-Cursor zu öffnen, kommt es zum Laufzeitfehler DBSQL_TOO_MANY_OPEN_CURSOR. Eine SELECT-Schleife kann mit den Anweisungen aus dem Abschnitt Schleifen verlassen beendet werden. Wenn die Ergebnismenge den Datenobjekten komplett in einem Schritt übergeben wird, wird keine Schleife geöffnet und die Anweisung ENDSELECT darf nicht angegeben werden.

Systemfelder

Die Anweisung SELECT setzt die Werte der Systemfelder sy-subrc und sy-dbcnt.

sy-subrc Bedeutung
0 Die Anweisung SELECT setzt sy-subrc bei jeder Wertübergabe an ein ABAP-Datenobjekt auf 0. Außerdem setzt SELECT sy-subrc vor dem Verlassen einer SELECT-Schleife über ENDSELECT auf 0, wenn in der Schleife mindestens eine Zeile übergeben wurde.
4 Die Anweisung SELECT setzt sy-subrc auf 4, wenn die Ergebnismenge leer ist. D.h. in der Regel, dass keine Daten auf der Datenbank gefunden wurden. Sonderregeln gelten bei der ausschließlichen Verwendung von Aggregatausdrücken als Spaltenangaben in der SELECT-Liste der SELECT-Klausel.
8 Die Anweisung SELECT setzt sy-subrc auf 8, wenn der Zusatz FOR UPDATE in result verwendet wird, ohne dass der Primärschlüssel vollständig hinter WHERE spezifiziert wird.

Die Anweisung SELECT setzt sy-dbcnt nach jeder Wertübergabe an ein ABAP-Datenobjekt auf die Anzahl der bis dahin übergebenen Zeilen. Wenn dabei ein Überlauf eintritt, weil die Anzahl der Zeilen größer als 2.147.483.647 ist, wird sy-dbcnt auf -1 gesetzt. Wenn die Ergebnismenge leer ist, wird sy-dbcnt auf 0 gesetzt. Wie bei sy-subrc gelten Sonderregeln bei der ausschließlichen Verwendung von Aggregatausdrücken als Spaltenangaben in der SELECT-Liste der SELECT-Klausel.

Hinweise

Beispiel

Das Beispiel zeigt zwei SELECT-Anweisungen, die sich nur in der Anordnung ihrer SELECT- und FROM-Klauseln unterscheiden. Das Ergebnis beider Anweisungen, die über einen INNER JOIN auf zwei Datenbanktabellen zugreifen, ist identisch.

DATA cityfrom TYPE spfli-cityfrom VALUE 'NEW YORK'.

SELECT c~carrname, p~connid, p~cityfrom, p~cityto
       FROM scarr AS c
            INNER JOIN spfli AS p
                  ON c~carrid = p~carrid
       WHERE p~cityfrom = @cityfrom
       ORDER BY c~carrname, p~connid, p~cityfrom, p~cityto
       INTO TABLE @DATA(result1)
       UP TO 10 ROWS.

SELECT FROM scarr AS c
            INNER JOIN spfli AS p
                  ON c~carrid = p~carrid
       FIELDS c~carrname, p~connid, p~cityfrom, p~cityto
       WHERE p~cityfrom = @cityfrom
       ORDER BY c~carrname, p~connid, p~cityfrom, p~cityto
       INTO TABLE @DATA(result2)
       UP TO 10 ROWS.

ASSERT result2 = result1.
cl_demo_output=>display( result1 ).





Weiterlesen
SELECT - mainquery_clauses
ENDSELECT
Example SELECT, dynamische Token-Angabe