AMDP
AMDP (ABAP Managed Database Procedures) — клас-базований фреймворк для керування database procedures і database functions прямо з ABAP. Код писаний на SQLScript і виконується на SAP HANA. ABAP керує деплоєм і викликом, але сам SQLScript працює на базі.
Використовуй AMDP, коли потрібна логіка на стороні бази, яку ABAP SQL не покриває (складні window functions, SQLScript procedures зі змінними та циклами, специфічні HANA built-ins). Якщо те саме можна зробити через ABAP SQL — роби через ABAP SQL: простіше, переноситься, client handling автоматичний.
AMDP-клас
Section titled “AMDP-клас”AMDP-клас — звичайний global class, який обовʼязково реалізує маркер-інтерфейс IF_AMDP_MARKER_HDB (HDB = HANA Database):
CLASS cl_demo_amdp DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION. INTERFACES if_amdp_marker_hdb. " обовʼязково ...ENDCLASS.У класі можна змішувати AMDP-методи та звичайні ABAP-методи.
AMDP procedure
Section titled “AMDP procedure”AMDP procedure — метод, який на базі стає database procedure. Оголошення таке саме, як у звичайного методу, але з обмеженнями:
- Параметри — тільки by value (
VALUE(...)). - Типи — елементарні або табличні зі структурованим рядком. Generic-типи заборонені.
- Returning не можна — тільки importing/exporting.
- Optional — тільки для importing.
TYPES tab_type TYPE STANDARD TABLE OF zdemo_abap_flsch WITH EMPTY KEY.
METHODS get_flights AMDP OPTIONS READ-ONLY CDS SESSION CLIENT DEPENDENT IMPORTING VALUE(carrid) TYPE s_carr_id EXPORTING VALUE(tab) TYPE tab_type.Імплементація — замість тіла ABAP використовується SQLScript:
METHOD get_flights BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT OPTIONS READ-ONLY USING zdemo_abap_flsch.
tab = SELECT carrid, connid, cityfrom, cityto, fltime FROM zdemo_abap_flsch WHERE carrid = :carrid;
ENDMETHOD.Ключові додавання після METHOD:
| Додавання | Призначення |
|---|---|
BY DATABASE PROCEDURE | Позначає метод як AMDP procedure |
FOR HDB | Цільова СКБД — HANA |
LANGUAGE SQLSCRIPT | Мова імплементації |
OPTIONS READ-ONLY | Тільки читання (обовʼязково в ABAP Cloud) |
USING <object> | Перелік обʼєктів, які використовуються у SQLScript (таблиці, view entities, інші AMDP-методи) |
AMDP table function
Section titled “AMDP table function”Повертає таблицю через RETURNING. Дві форми:
Для AMDP методів — виклик тільки з іншого AMDP-методу, не з ABAP.
METHODS calc_occupancy IMPORTING VALUE(carrid) TYPE s_carr_id RETURNING VALUE(tab) TYPE tab_type.
METHOD calc_occupancy BY DATABASE FUNCTION " <-- FUNCTION, не PROCEDURE FOR HDB LANGUAGE SQLSCRIPT OPTIONS READ-ONLY USING zdemo_abap_fli.
RETURN SELECT carrid, connid, seatsocc / seatsmax * 100 AS rate FROM zdemo_abap_fli WHERE carrid = :carrid;
ENDMETHOD.Для CDS table function — AMDP-метод реалізує CDS table function. Доступна з ABAP SQL як звичайне джерело даних.
Потрібно три обʼєкти:
- CDS table function (
define table function ...). - AMDP-клас з методом, позначеним
FOR TABLE FUNCTION. - SQLScript-імплементація.
define table function zdemo_abap_table_function with parameters p_carrid : s_carr_id returns { client : abap.clnt; carrid : s_carr_id; connid : s_conn_id; fltime : s_fltime; } implemented by method cl_demo_amdp=>get_flights_tf;CLASS-METHODS get_flights_tf FOR TABLE FUNCTION zdemo_abap_table_function.
METHOD get_flights_tf BY DATABASE FUNCTION FOR HDB LANGUAGE SQLSCRIPT OPTIONS READ-ONLY USING zdemo_abap_flsch.
RETURN SELECT client, carrid, connid, fltime FROM zdemo_abap_flsch WHERE carrid = :p_carrid;
ENDMETHOD.Параметрова секція методу не оголошується — тягнеться з CDS. Виклик з ABAP:
SELECT * FROM zdemo_abap_table_function( p_carrid = 'LH' ) INTO TABLE @DATA(result).AMDP scalar function
Section titled “AMDP scalar function”Повертає елементарне значення. Дві форми — “для AMDP-методів” і “для CDS scalar function”. Обидві — BY DATABASE FUNCTION, але перша викликається як звичайний ABAP-метод, друга — через CDS scalar function з ABAP SQL або CDS views.
METHODS get_max_fltime AMDP OPTIONS READ-ONLY CDS SESSION CLIENT DEPENDENT IMPORTING VALUE(carrid) TYPE s_carr_id RETURNING VALUE(max_fltime) TYPE s_fltime.
METHOD get_max_fltime BY DATABASE FUNCTION FOR HDB LANGUAGE SQLSCRIPT OPTIONS READ-ONLY USING zdemo_abap_flsch.
SELECT MAX(fltime) INTO max_fltime FROM zdemo_abap_flsch WHERE carrid = :carrid;
ENDMETHOD.Виклик з ABAP:
DATA(max) = NEW cl_demo_amdp( )->get_max_fltime( carrid = 'LH' ).AMDP у ABAP Cloud: client safety
Section titled “AMDP у ABAP Cloud: client safety”В ABAP Cloud AMDP дозволений, але обовʼязково client-safe — маєш доступ тільки до власного клієнта. ABAP SQL робить це неявно; AMDP використовує Native SQL, тому потрібні спеціальні додавання.
Обовʼязкові обмеження в ABAP Cloud:
AMDP OPTIONS READ-ONLYіOPTIONS READ-ONLY— тільки читання.- SQLScript — без native SQL, що обходить client filter.
- Усі обʼєкти в
USING— client-safe: released API, client-dependent CDS view entity зCDS SESSION CLIENT DEPENDENT, або client-independent.
Додавання до оголошення AMDP-методу:
| Додавання | Коли |
|---|---|
CDS SESSION CLIENT DEPENDENT | Метод client-dependent, хоч один обʼєкт у USING залежить від клієнта |
CLIENT INDEPENDENT | Метод працює тільки з client-independent обʼєктами |
Коли НЕ використовувати AMDP
Section titled “Коли НЕ використовувати AMDP”- Завдання вирішується ABAP SQL — бери ABAP SQL.
- Потрібна переносимість на інші БД — AMDP прибʼє тебе до HANA.
- Великий обсяг бізнес-логіки — краще в ABAP або в RAP behaviors.
- Модифікації даних у ABAP Cloud — заборонено (
READ-ONLYобовʼязково).
Адаптовано з 12_AMDP.md (Apache 2.0). Повний перелік нюансів — в оригіналі.