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

SELECT - SINGLE

Kurzreferenz

Syntax

... SINGLE [FOR UPDATE] ...

Zusatz:

... FOR UPDATE

Wirkung

Mit dem ABAP-spezifischen Zusatz SINGLE ist die Ergebnismenge einer Query einzeilig. Der Zusatz ist möglich bei einer eigenständigen SELECT-Anweisung oder der Hauptquery einer eigenständigen WITH-Anweisung. Wenn SINGLE angegeben ist, öffnen diese Anweisungen beim Einlesen in einen nicht-tabellenartigen Zielbereich keine mit ENDSELECT bzw. ENDWITH abzuschließende Schleife und es kann keine interne Tabelle als Zielbereich angegeben werden.

Es gelten folgende Einschränkungen:

Hinweise

Eine SELECT-Anweisung mit dem Zusatz SINGLE ist bei vollständig spezifizierter Zeile in aller Regel schneller als bei unvollständiger Spezifizierung der Zeile.
Da eine SELECT-Anweisung mit dem Zusatz SINGLE auf das Auslesen genau einer Zeile optimiert ist, ist sie in der Regel etwas schneller als mit dem Zusatz UP TO 1 ROWS. Der Unterschied dürfte in der Praxis aber keine Rolle spielen. Es wird deshalb empfohlen,

Beispiel

Auslesen der Zeile mit den Angaben zum Lufthansa-Flug 0400 aus der Datenbanktabelle SPFLI.

SELECT SINGLE *
       FROM spfli
       WHERE carrid = 'LH' AND
             connid = '0400'
       INTO @DATA(wa).

Beispiel

Das Programm DEMO_SELECT_SINGLE_VS_UP_TO vergleicht die Performance von SELECT-Anweisungen mit dem Zusatz SINGLE mit gleichwertigen Anweisungen mit dem Zusatz UP TO 1 ROWS.

Zusatz

... FOR UPDATE

Wirkung

Der Zusatz FOR UPDATE setzt beim Lesen einer einzelnen Zeile mit SINGLE eine Datenbanksperre in Form einer Schreibsperre für diese Zeile auf der Datenbank. Die SELECT-Anweisung wird in diesem Fall nur dann ausgeführt, wenn in der WHERE-Bedingung alle Primärschlüsselfelder in mit AND verknüpften logischen Ausdrücken auf Gleichheit überprüft werden. Andernfalls ist die Ergebnismenge leer und sy-subrc wird auf 8 gesetzt.

Hinweise

Beispiel

Im folgenden Beispiel wird die von der Anweisung DELETE gesetzte Schreibsperre über einen Datenbank-Commit gelöst. Dann wird eine Schreibsperre bereits von der Anweisung SELECT und nicht erst von der Anweisung UPDATE verhängt.

DELETE FROM demo_expressions.
INSERT demo_expressions FROM @( VALUE #( id = 'X' ) ).
COMMIT CONNECTION default.

...

SELECT SINGLE FOR UPDATE id, num1
       FROM demo_expressions
       WHERE id = 'X'
       INTO @DATA(wa).

...

UPDATE demo_expressions SET num1 = 111 WHERE id = 'X'.