SAP NetWeaver AS ABAP Release 751, ©Copyright 2017 SAP AG. Alle Rechte vorbehalten.
ABAP - Schlüsselwortdokumentation → ABAP - Referenz → Externe Daten verarbeiten → ABAP-Datenbankzugriffe → Open SQL → Open SQL - Lesende Zugriffe →
SELECT
Syntax
SELECT mainquery_clauses
[UNION ...]
INTO|APPENDING target
[additional_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 zusätzliche Regeln query_clauses für die Angabe der Klauseln. Abschließend werden folgende Eigenschaften definiert:
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 ).