Перейти до вмісту

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-клас — звичайний 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 — метод, який на базі стає 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-методи)

Повертає таблицю через 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 як звичайне джерело даних.

Потрібно три обʼєкти:

  1. CDS table function (define table function ...).
  2. AMDP-клас з методом, позначеним FOR TABLE FUNCTION.
  3. 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-методів” і “для 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' ).

В 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). Повний перелік нюансів — в оригіналі.