AMDP-Prozeduren

AMDP-Prozeduren

Veröffentlicht am 29. Oktober 2020 von

Jörg Brandeis

| AMDP | BW/4HANA | SQLScript |

Mit AMDP-Prozeduren kann im ABAP ganz einfach und elegant komplexere Anforderungen in der SAP HANA Datenbank auslagern. Ein Auszug aus der 2. Auflage meines Buches „SQLScript für SAP HANA“, erschienen im Rheinwerkverlag, SAP Press.

AMDP-Prozeduren

Eine AMDP-Prozedur ist aus der Perspektive eines ABAP-Entwicklers eine Instanzmethode einer ABAP-Klasse, die in der Programmiersprache SQLScript implementiert ist. Durch diesen Kunstgriff werden mehrere Probleme gelöst:

  • Der Aufruf der SQL-Prozedur erfolgt als Methodenaufruf einer ABAP-Klasse. Damit ist der Prozeduraufruf perfekt in ABAP integriert.
  • Der Transport der Datenbankprozedur erfolgt über die ABAP-Klasse. Es sind damit nicht mehrere Transportmechanismen involviert, die synchron gehalten werden müssen.
  • Es ist zum Entwicklungszeitpunkt für den Entwickler nicht notwendig, einen direkten Zugriff auf die SAP-HANA-Datenbank mit den entsprechenden Berechtigungen zu haben. Es genügt, mit den üblichen ABAP Entwicklerberechtigungen mit den ADT zu arbeiten.

In den folgenden Abschnitten werden die Bezeichnungen AMDP und AMDP-Prozedur synonym verwendet. Wenn es nicht explizit erwähnt wird, beziehen sich die Informationen nicht auf AMDP-Funktionen.

Anlegen von AMDP-Prozeduren

IF_AMDP_MARKER_HDB

Eine AMDP-Methode kann nur in einer globalen Klasse angelegt werden, die das Marker-Interface IF_AMDP_MARKER_HDB implementieren. Das Interface selber hat keine Methoden, es dient ausschließlich zur Markierung der AMDP-Klassen.

Eine AMDP-Klasse kann sowohl normale ABAP-Methoden als auch AMDP-Methoden umfassen. Ob eine Methode als AMDP implementiert ist, wird nicht in der Deklaration der Methode festgelegt. Das folgende Listing zeigt ein Beispiel.

CLASS zcl_amdp_demo DEFINITION
  PUBLIC
  CREATE PUBLIC.

  PUBLIC SECTION.
    INTERFACES if_amdp_marker_hdb.
    TYPES gty_tt_countries TYPE TABLE OF t005t.
    METHODS get_countries
      IMPORTING
        VALUE(iv_langu)   TYPE  langu
      CHANGING
        VALUE(ct_country) TYPE  gty_tt_countries 
        VALUE(cv_subrc)   TYPE sy-subrc.
ENDCLASS.

CLASS zcl_amdp_demo IMPLEMENTATION.
  METHOD get_countries
     BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT
     USING t005t.

    ct_country = select * 
                 FROM t005t
                 WHERE spras = :iv_langu;
                 
    SELECT CASE 
              WHEN COUNT(*) > 0 
              THEN 0
              ELSE 4 
              END AS subrc
          INTO cv_subrc
          FROM :ct_country;
  ENDMETHOD.
ENDCLASS.

Beispiel für eine einfache AMDP-Methode

Einschränkungen der Methodensignatur

Aus dem Quelltext einer AMDP-Methode wird später eine SQLScript-Prozedur generiert. Diese Datenbankprozeduren sind aber in Bezug auf die Parameter restriktiver, als dies bei ABAP-Methoden der Fall ist. Entsprechend müssen diese Einschränkungen natürlich auch für AMDP-Methoden gelten;

  • Zunächst einmal müssen alle Parameter vollständig typisiert sein. Generische Datentypen wie z. B. TYPE TABLE oder REF TO DATA sind nicht zulässig.
  • Da SQLScript keine Strukturen kennt, dürfen als Parameter nur skalare Datentypen und Tabellentypen verwendet werden. Die Tabellentypen wiederum dürfen in ihrer Zeilenstruktur nur skalare Datentypen verwenden.
  • Alle Parameter müssen als Wertparameter (call by value) übergeben werden; die Verwendung von Referenzparametern (call by reference) ist nicht möglich. Das ist offensichtlich, wenn man sich vor Augen hält, dass der Anwendungsserver auf einem anderen System läuft als die Datenbank. Entsprechend gibt es keinen gemeinsamen Speicherbereich, den beide Systeme referenzieren.
  • Es sind nur IMPORTING-, EXPORTING- und CHANGING-Parameter bei AMDP-Prozeduren erlaubt. Die Verwendung von RETURNING-Parametern ist nicht möglich.
  • Es können ausschließlich AMDP-Ausnahmeklassen in der Signatur der Methode deklariert werden. Dies sind die Sub-Klassen von CX_AMDP_ERROR. Wenn diese deklariert werden, kann der Aufrufer der AMDP-Methode diese Ausnahmen behandeln. Wenn diese aber nicht deklariert sind, führen diese Fehler zu einem Dump.

Implementierung einer AMDP-Prozedur

AMDP-Prozeduren werden in der Sprache SQLScript entwickelt. Dies wird dem System durch den Zusatz BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT mitgeteilt.

OPTIONS READ-ONLY

Wenn eine AMDP-Implementierung nur lesend auf Daten zugreift, kann optional der Zusatz OPTIONS READ-ONLY angegeben werden.

USING

Mit dem optionalen Zusatz USING kann einer AMDP-Implementierung mitgeteilt werden, dass man die entsprechenden Tabellen, Views, AMDP-Funktionen oder AMDP-Prozeduren aus dem Standard-Datenbankschema des NetWeaver-Systems verwendet. Damit kann man diesen Namen verwenden, ohne das jeweilige Datenbankschema im SQLScript-Quelltext immer explizit mitzugeben. Die Objekte werden nur durch Whitespace getrennt nach dem Schlüsselwort USING aufgezählt. Zu beachten ist hierbei, dass es sich noch um ABAP-Code handelt. Wenn Sie z. B. eine vom BW generierte Tabelle aus dem Generierungsnamensraum /BIC/ oder /BI0/ angeben, erfolgt das ohne Gänsefüßchen, also z. B.:

...USING /BI0/PPLANT.

Wenn Sie im SQLScript-Code auf diese Tabelle zugreifen, müssen Sie aber die spezielle Notation verwenden, da der Schrägstrich nicht in der einfachen Notation zulässig ist:

SELECT ... FROM "/BI0/PPLANT".

USING für AMDP-Objekte

Die Verwendung von AMDP-Prozeduren und -Funktionen wird in der USING-Klausel über den Namen der zugehörigen ABAP-Methode mit der Notation KLASSE=>METHODE deklariert. In Listing 1.2 sehen Sie ein Beispiel für die Schlüsselwörter in der METHOD-Klausel der Methodenimplementierung. Alles nach dem Punkt in Zeile 5 bis zum Schlüsselwort ENDMETHOD wird als SQLScript interpretiert.

  METHOD get_countries
     BY DATABASE PROCEDURE FOR HDB 
     LANGUAGE SQLSCRIPT
     OPTIONS READ-ONLY
    USING t005t.

    <SQLScript-Code>
  ENDMETHOD.

Schlüsselwörter bei der Implementierung einer AMDP-Methode

Hinweis: Ein allgemeines Konzept für eine spezielle Datenbank

Grundsätzlich sind alle Anweisungen und Deklarationen im Zusammenhang mit AMDP so ausgelegt, dass AMDPs auf unterschiedlichen Datenbanksystemen und in unterschiedlichen Sprachen implementierbar sind. Entsprechend gibt es bei der Implementierung der AMDP-Methoden auch die obligatorischen Angaben FOR <Datenbanksystem> und LANGUAGE <Abfragesprache>.

Allerdings sind bis heute (Release SAP NetWeaver 7.51) nur Implementierungen für die SAP-HANA-Datenbank mit der Sprache SQLScript möglich. Die Sprache L darf nur SAP-intern verwendet werden.

Die anderen Datenbanksysteme unter SAP NetWeaver bringen jeweils ihre eigenen Programmiersprachen mit, wie z. B. Oracle die Sprache PL/SQL. Diese können jedoch nicht zum Implementieren von AMDPs genutzt werden.


Weiterführende Links