AMDP-Prozeduren
Veröffentlicht am 29. Oktober 2020 von | 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
oderREF 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
- undCHANGING
-Parameter bei AMDP-Prozeduren erlaubt. Die Verwendung vonRETURNING
-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
- Blog Artilel über AMDP Debugging in Transformationsroutinen
- Blog Artikel über das AMDP Framework
- SAP Dokumentation über AMDP