Академический Документы
Профессиональный Документы
Культура Документы
Procedures (AMDP)
Все больше в настоящее время SAP систем переходят на новую платформу (СУБД)
– HANA (High-Performance Analytic Appliance), в основе которой лежит технология
вычислений in-memory с использованием принципа поколоночного хранения
данных. Вместе с новой платформой, появляются так же и новые возможности для
обработки больших объемов данных и более высокопроизводительных
вычислений.
Для ускорения ABAP решений на базе HANA, используется перенос вычислений с
уровня сервера приложений (AS ABAP) на сервер СУБД (Code-to-Data). Данную
задачу можно решить несколькими способами, одним из которых
является использование Native SQL и AMDP как средства его вызова.
В контексте ABAP разработки, под Native SQL понимается язык SQL запросов
поддерживаемый текущей или дополнительной СУБД сервера приложений.
В данной статье будут рассмотрены основные моменты использования AMDP.
SAP рекомендует использовать Native SQL в ABAP только тогда, когда задачу
оптимизации не решить стандартными средствами OpenSQL, в частности AMDP
следует использовать только если будут задействованы какие-то специфичные для
HANA вещи или объем данных слишком велик чтобы переносить его между СУБД
и сервером приложений.
Вызывать Native SQL в ABAP напрямую можно несколькими методами, среди
которых:
ADBC классы,
EXEC SQL (без возможности использования динамики),
AMDP.
Косвенно через:
AMDP классы
AMDP методы
Метод AMDP может быть как статическим, так и методом инстанции с любой
видимостью. По своему описанию в заголовке класса он ничем не отличается от
обычных методов. Понять, что это AMDP метод можно только заглянув в
исходный код.
На AMDP метод накладываются определенные ограничения.
Ограничения в интерфейсе:
Нельзя использовать обобщенные типы (TYPE DATA, TYPE CSEQUENCE и др.),
доступны только элементарные типы данных и табличные, компоненты которых
являются элементарными.
Нельзя использовать для описания типа устаревшие словарные типы – DF16_SCL и
DF34_SCL.
Параметры всегда должны переноситься по значению, перенос по ссылке
недоступен.
RETURNING параметры запрещены.
Только входные параметры могут быть помечены как необязательные и для всех
необязательных параметров необходимо, чтобы было задано начальное значение.
Параметры с типами f, decfloat16, decfloat34, string, и xstring не могут быть со
значением по умолчанию, а значит, они не могут быть необязательными.
Имена параметров:
o Не могут начинаться с префикса «%_».
o Нельзя использовать параметры с именами: endmethod и client.
Если используется параметр с именем connection, он обязательно должен иметь тип
– DBCON_NAME, используется он когда AMDP вызывается через сервисное
подключение, в таком случае его адрес необходимо будет передать через параметр.
При описании исключений можно использовать только
заранее определенные классы исключений. Классические исключения недоступны.
CHANGING параметры не могут иметь тип string или xstring.
Длина параметров с типом C или N не может превышать 5000 символов.
В ABAP 7.4. можно реализовать только метод AMDP процедуры, в 7.5 добавилась
так же возможность создания метода AMDP функции. AMDP функции можно
использовать для получения данных в других AMDP процедурах и функциях, в
ABAP CDS и даже в OpenSQL. Для функций параметр RETURNING является
обязательным. В статье реализация функций не рассматривается, подробнее о
функциях смотрите в документации.
Для AMDP методов, как и для обычных методов доступна поддержка
наследования, пример использования можно посмотреть в программе –
demo_amdp_polymorphism. Таким образом, можно сделать разные реализации и в
зависимости от поддержки AMDP, вызывать либо их, либо обычные методы с
OpenSQL.
Так как AMDP это Native SQL, поддержка клиента (манданта) должна быть
реализована вручную, как правило клиент предаётся внутрь AMDP как параметр.
Другим способом является возможность использования специальной
функции – SESSION_CONTEXT, использовать которую следует, только если ваша
AMDP процедура вызывается из ABAP.
Как уже говорилось выше, понять, что это AMDP метод можно только по
исходному коду. Меткой для системы в таком случае служит дополнение BY
DATABASE PROCEDURE у выражения – METHOD.
Синтаксис этого дополнения следующий:
2 FOR db
3 LANGUAGE db_lang
4 [OPTIONS db_options]
5 [USING db_entities].
6
...
7
ENDMETHOD.
Дополнение FOR определяет, для какой СУБД создана текущая AMDP процедура.
В настоящее время доступно только определение для HANA:
db СУБД Интерфейс
AMDP BADI
Вызываются такие AMDP BAdi так же как и стандартные Kernel BAdi через GET
BADI, CALL BADI.
В следующем видео подробно с примерами разобрано использование AMDP BAdi:
Отладка AMDP
1
CLASS zcl_amdp_test_case1 DEFINITION
2
PUBLIC
3
FINAL
4
CREATE PUBLIC .
5
PUBLIC SECTION.
6
INTERFACES: if_amdp_marker_hdb.
7
CLASS-METHODS:
8
amdp_get_aa EXPORTING VALUE(et_aa) TYPE SPFLI_TAB RAISING
9 cx_amdp_error,
10 amdp_get_ua EXPORTING VALUE(et_ua) TYPE SPFLI_TAB RAISING
11 cx_amdp_error,
12 amdp_get_all EXPORTING VALUE(et_all) TYPE spfli_tab RAISING cx_amdp_error.
13 PROTECTED SECTION.
14 PRIVATE SECTION.
15 ENDCLASS.
16
17 CLASS zcl_amdp_test_case1 IMPLEMENTATION.
18 METHOD amdp_get_aa BY DATABASE PROCEDURE FOR HDB LANGUAGE
SQLSCRIPT
19
USING spfli.
20
et_aa = SELECT * FROM spfli WHERE carrid = 'AA';
21
ENDMETHOD.
22
23
24 METHOD amdp_get_ua BY DATABASE PROCEDURE FOR HDB LANGUAGE
SQLSCRIPT
25
USING spfli.
26
et_ua = SELECT * FROM spfli WHERE carrid = 'UA';
27
ENDMETHOD.
28
29
METHOD amdp_get_all BY DATABASE PROCEDURE
30
FOR HDB LANGUAGE SQLSCRIPT
31
USING zcl_amdp_test_case1=>amdp_get_aa
32
zcl_amdp_test_case1=>amdp_get_ua.
33
call "ZCL_AMDP_TEST_CASE1=>AMDP_GET_AA"(
34
ET_AA => :lt_aa );
35
call "ZCL_AMDP_TEST_CASE1=>AMDP_GET_UA"(
36
ET_UA => :lt_ua );
et_all = CE_UNION_ALL(:lt_aa, :lt_ua );
ENDMETHOD.
ENDCLASS.
b SMALLINT –
s SMALLINT –
i INTEGER –
p, длинна leng с dec знаками DECIMAL, –
после запятой длинна 2 leng-
1 c dec знаками после
запятой
f DOUBLE –