Blog
ARTIKEL

ABAP SQL Host Expressions

Mit dem ABAP Release 7.50 führte SAP die SQL Host Expressions ein.
Damit ist es möglich, direkt im SQL Statement ABAP Ausdrücke bzw. ABAP Coding zu verwenden.

SELECT … @( HOST-EXPRESSION ) …

Verwendung

Host Expressions können überall im SQL Statement verwendet werden, wo auch Host Variablen verwendet werden können. Und damit ist auch der primäre Nutzen klar:
Wir können Variablendeklarationen einsparen und damit kompakteren Code schreiben.

Aus 2 Kommandos

DATA(firstfoundpartner) = but000_records[ 1 ]-partner.

SELECT FROM I_BusinessPartner
       FIELDS BusinessPartner,
              BusinessPartnerName
       WHERE BusinessPartner = @firstfoundpartner
       INTO TABLE @DATA(partners).

wird eines:

SELECT FROM I_BusinessPartner
       FIELDS BusinessPartner,
              BusinessPartnerName
       WHERE BusinessPartner = @( but000_records[ 1 ]-partner )
       INTO TABLE @DATA(partners).

Und das funktioniert an vielen Stellen und auch mit funktionalen Methoden (mit Returning Parameter)

SELECT FROM I_BusinessPartner
  FIELDS BusinessPartner,
         BusinessPartnerName,
         @( get_table_name(  ) ) AS TableName
  WHERE BusinessPartner = @( get_partner( ) )
  INTO TABLE @DATA(partners)
  UP TO @( get_upto( ) ) ROWS.

aber nicht überall! Bei LIKE und IN geht es leider nicht

SELECT FROM I_BusinessPartner
  FIELDS BusinessPartner,
         BusinessPartnerName
  WHERE  BusinessPartner IN @( host_expression->get_partner_range( ) )
  INTO TABLE @DATA(partners)

Was aber funktioniert, ist die Datenbereitstellung (ITabs oder Workareas) für INSERT, UPDATE, MODIFY und DELETE

UPDATE but000 FROM TABLE @( get_but000_records( ) ).

DELETE but000 FROM @( VALUE #( partner = 'YYDUMMY121' ) ).

Aufgelöst werden die Host Expressions von links beginnend. Bei dem SELECT würden die Methoden in dieser Reihenfolge ausgeführt:

  1. get_table_name
  2. get_partner
  3. get_upto
SELECT FROM I_BusinessPartner
  FIELDS BusinessPartner,
         BusinessPartnerName,
         @( get_table_name(  ) ) AS TableName
  WHERE BusinessPartner = @( get_partner( ) )
  INTO TABLE @DATA(partners)
  UP TO @( get_upto( ) ) ROWS.

Performance

Da die Expressions bzw. das ABAP Coding ausgeführt werden muss und die Werte auch, wie bei Hostvariablen, an die Datenbank übertragen werden müssen, ergeben sich keine relevanten Laufzeitunterschiede.

Security

Da die Host Expressions zusammen mit dem SQL Befehl ausgeführt werden, sind sie nur bedingt „debuggbar“ und ein ändern der Werte im Debugger wird erschwert.

Ein super Beispiel, wie wir die Sicherheit unserer Codings durch Host Expressions verbessern können, sehen wir in diesem SELECT:

SELECT FROM I_BusinessPartner
  FIELDS BusinessPartner,
         BusinessPartnerName
  WHERE CreatedByUser = @sy-uname
  INTO TABLE @DATA(my_partners).

Mit den entsprechenden Berechtigungen kann der Benutzer den Wert von SY-UNAME im Debugger ändern und Einträge anderer Benutzer selektieren.
Mit einer Hostexpression und der passenden Methode, ist das nicht mehr möglich:

SELECT FROM I_BusinessPartner
  FIELDS BusinessPartner,
         BusinessPartnerName
  WHERE CreatedByUser = @( cl_abap_syst=>get_user_name( ) )
  INTO TABLE @DATA(really_my_partners).

Hinweis: Bei CDS Entities sollte das natürlich über ABAP CDS – Access Control (Data Control Language – DCL) gelöst werden!

Fazit

Host Expressions revolutionieren jetzt nicht die Verwendung von SQL im ABAP Coding. Sie sind aber ein nettes Feature und richtig eingesetzt, machen sie unser Coding kompakter und sicherer!

Passend dazu

Alle Artikel →
Unser Tipp für Sie

SQL Cockpit for SAP® Systems

Revisionssichere Datenänderungen und ein leistungsstarker ABAP Open SQL Editor direkt im SAP-System.

Mehr erfahren →