ABAP中之AMDP(ABAP-Managed Database Procedures )ABAP中的AMDP(ABAP-Managed Database Procedures )

by admin on 2018年10月5日

ABAP管理下的数据库存储过程(ABAP-Managed Database
Procedure,以下简称AMDP)是以APAP on SAP
HANA开发中之平栽优化模式。AMDP使用数据库语言书写,比如Native
SQL或者是SQL
Script,并且于AMDP类的AMDP方法外实现。因此用它们开发数据库存储过程就是发生硌类似于编辑ABAP类。

ABAP管理下的数据库存储过程(ABAP-Managed Database
Procedure,以下简称AMDP)是于APAP on SAP
HANA开发被的一致种植优化模式。AMDP使用数据库语言书写,比如Native
SQL或者是SQL
Script,并且以AMDP类的AMDP方法外实现。因此用她开发数据库存储过程即发硌类似于编辑ABAP类。

简单,AMDP允许开发者直接在ABAP中描绘数据库存储过程。

简易,AMDP允许开发者直接以ABAP中形容数据库存储过程。

 

 

正文链接:http://www.cnblogs.com/hhelibeb/p/7976533.html

本文链接:http://www.cnblogs.com/hhelibeb/p/7976533.html

转载请注明

转载请注明

为何以AMDP?

按SAP的法定建议,在好下Open
SQL实现用的成效还是优化目标的早晚,不建议用AMDP。而在急需使用Open
SQL不存在的风味,或者是大方处理流和分析导致了数据库及应用服务器之间来再的大气数量传的情况下,则当采取AMDP。

切切实实的事例可以省:AMDP, Comparison of SQLScript with Open
SQL
,

          SAP HANA, Currency Conversion with
SQLScript
   

AMDP还能提供以下好处:

  • SQL Script的静态代码检查
  • 语法高亮(支持pretty printer格式优化器) 
  • 每当AMDP内访问其它AMDP方法、ABAP字典的视图和表 
  • 得像一般的ABAP方法一致调用(不包括AMDP function)  
  • 动ST22进行运转时不当的详细分析    

介绍视频:

为什么使用AMDP?

按SAP的合法建议,在足以Open
SQL实现需要之效用或优化目标的时,不建议以AMDP。而以得采取Open
SQL不有的性状,或者是大度处理流和分析导致了数据库与应用服务器之间产生再次的大方数传的情下,则应当用AMDP。

切实的例子可以看:AMDP, Comparison of SQLScript with Open
SQL
,

          SAP HANA, Currency Conversion with
SQLScript
   

AMDP还会提供以下好处:

  • SQL Script的静态代码检查
  • 语法高亮(支持pretty printer格式优化器) 
  • 当AMDP内访问其它AMDP方法、ABAP字典的视图和表 
  • 足像平常的ABAP方法同样调用(不包括AMDP function)  
  • 行使ST22进行运行时左的详细分析    

介绍视频:

语法

AMDP在AMDP类中贯彻,需要一个正式的静态方法或者实例方法,可见性任意:

CLASS <my_amdp_class> DEFINITION.

  PUBLIC SECTION.
* 指定的Marker接口
  INTERFACES IF_AMDP_MARKER_<DB_TYPE>.
   ...

  METHODS <my_amdp_method>.
   ...

ENDCLASS.


CLASS <my_amdp_class> IMPLEMENTATION.

...

* AMDP 方法 
  METHOD <my_amdp_method> BY DATABASE PROCEDURE 
        FOR <db_type>
        LANGUAGE <db_language>
         OPTIONS <db_options>  
         USING   <db_entity>.

      "使用数据库语言实现存储过程
     ...

  ENDMETHOD.
    ...

ENDCLASS.

AMDP类就是惯常的切近,并促成IF_AMDP_MARKER_<DB_TYPE>接口。如果是HANA数据库,那么就是是促成接口IF_AMDP_MARKER_HDB。不过,虽然条件上AMDP是为支持各种数据库的储存过程要在的,但至眼前(ABAP
7.52)为止,AMDP只支持SAP
HANA数据库。可以采用类CL_ABAP_DBFEATURES丁之常量CALL_AMDP_METHOD来确认AMDP对目前数据库的支撑。

语法

AMDP在AMDP类中实现,需要一个正经的静态方法或者实例方法,可见性任意:

CLASS <my_amdp_class> DEFINITION.

  PUBLIC SECTION.
* 指定的Marker接口
  INTERFACES IF_AMDP_MARKER_<DB_TYPE>.
   ...

  METHODS <my_amdp_method>.
   ...

ENDCLASS.


CLASS <my_amdp_class> IMPLEMENTATION.

...

* AMDP 方法 
  METHOD <my_amdp_method> BY DATABASE PROCEDURE 
        FOR <db_type>
        LANGUAGE <db_language>
         OPTIONS <db_options>  
         USING   <db_entity>.

      "使用数据库语言实现存储过程
     ...

  ENDMETHOD.
    ...

ENDCLASS.

AMDP类就是常见的类似,并落实IF_AMDP_MARKER_<DB_TYPE>接口。如果是HANA数据库,那么即使是促成接口IF_AMDP_MARKER_HDB。不过,虽然标准上AMDP是以支持各种数据库的蕴藏过程要留存的,但至即(ABAP
7.52)为止,AMDP只支持SAP
HANA数据库。可以动用类似CL_ABAP_DBFEATURES吃的常量CALL_AMDP_METHOD来认可AMDP对目前数据库的支持。

粗略示例

示例类CL_DEMO_AMDP_SCARR绑定了接口IF_AMDP_MARKER_HDB,并且包含AMDP方法SELECT_SCARR来起表SCARR中获取数据(笔者目前无相应的条件,所以写了只ztest_amdp来替代示例):

CLASS ztest_amdp DEFINITION
  PUBLIC
  FINAL
  CREATE PUBLIC .

  PUBLIC SECTION.
    INTERFACES if_amdp_marker_hdb.
    CLASS-DATA: scarr_tab TYPE ty_scarr.
    METHODS select_scarr IMPORTING VALUE(clnt)      TYPE mandt
                         EXPORTING VALUE(scarr_tab) TYPE ty_scarr.
ENDCLASS.


CLASS ztest_amdp IMPLEMENTATION.
  METHOD select_scarr
         BY DATABASE PROCEDURE FOR HDB
         LANGUAGE SQLSCRIPT
         OPTIONS READ-ONLY
         USING scarr.
    scarr_tab =
    SELECT *
           FROM "SCARR"
           WHERE mandt = clnt
           ORDER BY carrid;
  ENDMETHOD.
ENDCLASS.

 

以下代码可以就此来调用方法、获取结果:

DATA result TYPE ty_scarr.

NEW ztest_amdp( )->select_scarr(
  EXPORTING clnt = sy-mandt
  IMPORTING scarr_tab = result ).

cl_demo_output=>display( result ). 

简单示例

示例类CL_DEMO_AMDP_SCARR绑定了接口IF_AMDP_MARKER_HDB,并且包含AMDP方法SELECT_SCARR来打表SCARR中获取数据(笔者目前尚无对号入座的条件,所以写了单ztest_amdp来取代示例):

CLASS ztest_amdp DEFINITION
  PUBLIC
  FINAL
  CREATE PUBLIC .

  PUBLIC SECTION.
    INTERFACES if_amdp_marker_hdb.
    CLASS-DATA: scarr_tab TYPE ty_scarr.
    METHODS select_scarr IMPORTING VALUE(clnt)      TYPE mandt
                         EXPORTING VALUE(scarr_tab) TYPE ty_scarr.
ENDCLASS.


CLASS ztest_amdp IMPLEMENTATION.
  METHOD select_scarr
         BY DATABASE PROCEDURE FOR HDB
         LANGUAGE SQLSCRIPT
         OPTIONS READ-ONLY
         USING scarr.
    scarr_tab =
    SELECT *
           FROM "SCARR"
           WHERE mandt = clnt
           ORDER BY carrid;
  ENDMETHOD.
ENDCLASS.

 

以下代码可以用来调用方法、获取结果:

DATA result TYPE ty_scarr.

NEW ztest_amdp( )->select_scarr(
  EXPORTING clnt = sy-mandt
  IMPORTING scarr_tab = result ).

cl_demo_output=>display( result ). 

AMDP方法

AMDP方法有点儿栽实现,一栽是AMDP
procedure兑现;另一样种植是AMDP
function实现。

AMDP方法

AMDP方法有少数栽实现,一栽是AMDP
procedure心想事成;另一样种植是AMDP
function实现。

AMDP procedure实现

亟需动用Method语句之附加项BY DATABASE
PROCEDURE。例子见上文。这种实现方式写成的方式以及常见的ABAP对象方法以应用方法达成没区别。

AMDP procedure实现

要采用Method语句之附加项BY DATABASE
PROCEDURE。例子见上文。这种实现方式写成的法门与平凡的ABAP对象方法在运方法达成尚未区别。

AMDP function实现

待采取Method语句的增大项BY DATABASE
FUNCTION。它以AMDP方法实现呢一个table function。

tips: table function

  table function是只读的用户定义的方法,可以接收多个输入参数。接收单一的表返回值。

  在SQL Scitpt中,table function可以在与数据库表或者视图相同的位置使用。

 

以身作则代码:

REPORT demo_amdp_functions_inpcl.

CLASS demo DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS main.
ENDCLASS.

CLASS demo IMPLEMENTATION.
  METHOD main.
    IF NOT cl_abap_dbfeatures=>use_features(
          EXPORTING
            requested_features =
              VALUE #( ( cl_abap_dbfeatures=>call_amdp_method )
                       ( cl_abap_dbfeatures=>amdp_table_function ) ) ).
      cl_demo_output=>display(
        `System does not support AMDP or CDS table functions` ).
      RETURN.
    ENDIF.

    DATA carrid TYPE s_carr_id VALUE 'LH'.
    cl_demo_input=>request( CHANGING field = carrid ).
    carrid = to_upper( carrid ).

    "Database function selected in database procedure
    TRY.
        NEW cl_demo_amdp_functions_inpcl( )->select_get_scarr_spfli(
          EXPORTING clnt   = sy-mandt
                    carrid = carrid
          IMPORTING scarr_spfli_tab = DATA(result1) ).
      CATCH cx_amdp_error INTO DATA(amdp_error).
        cl_demo_output=>display( amdp_error->get_text( ) ).
        RETURN.
    ENDTRY.

    cl_demo_output=>display( result1 ).

  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  demo=>main( ).

 

地方是例子访问的AMDP
function可以在类CL_DEMO_AMDP_FUNCTIONS_INPCL中看到。

方法GET_SCARR_SPFLI是一个AMDP
function实现,它是匪可知直接以ABAP中做客的:

METHOD get_scarr_spfli BY DATABASE FUNCTION FOR HDB
                       LANGUAGE SQLSCRIPT
                       OPTIONS READ-ONLY
                       USING scarr spfli.
  RETURN SELECT sc.carrname, sp.connid, sp.cityfrom, sp.cityto
                FROM scarr AS sc
                  INNER JOIN spfli AS sp ON sc.mandt = sp.mandt AND
                                            sc.carrid = sp.carrid
                  WHERE sp.mandt = :clnt AND sp.carrid = :carrid
                  ORDER BY sc.mandt, sc.carrname, sp.connid;

ENDMETHOD.

 

而方法SELECT_GET_SCARR_SPFLI是一个AMDP
procedure实现,它应用select从地方的function实现着获取数据。代码如下:

METHOD select_get_scarr_spfli
       BY DATABASE PROCEDURE FOR HDB
       LANGUAGE SQLSCRIPT
       OPTIONS READ-ONLY
       USING cl_demo_amdp_functions_inpcl=>get_scarr_spfli.
  SCARR_SPFLI_TAB =
  SELECT *
         FROM "CL_DEMO_AMDP_FUNCTIONS_INPCL=>GET_SCARR_SPFLI"(
                clnt => :clnt,
                carrid => :carrid );
ENDMETHOD.

 

也得以将AMDP function实现吗CDS table function。这里虽不贴示例了。

 

有关AMDP实现的视频教程:

AMDP function实现

亟待以Method语句的叠加项BY DATABASE
FUNCTION。它将AMDP方法实现为一个table function。

tips: table function

  table function是只读的用户定义的方法,可以接收多个输入参数。接收单一的表返回值。

  在SQL Scitpt中,table function可以在与数据库表或者视图相同的位置使用。

 

示范代码:

REPORT demo_amdp_functions_inpcl.

CLASS demo DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS main.
ENDCLASS.

CLASS demo IMPLEMENTATION.
  METHOD main.
    IF NOT cl_abap_dbfeatures=>use_features(
          EXPORTING
            requested_features =
              VALUE #( ( cl_abap_dbfeatures=>call_amdp_method )
                       ( cl_abap_dbfeatures=>amdp_table_function ) ) ).
      cl_demo_output=>display(
        `System does not support AMDP or CDS table functions` ).
      RETURN.
    ENDIF.

    DATA carrid TYPE s_carr_id VALUE 'LH'.
    cl_demo_input=>request( CHANGING field = carrid ).
    carrid = to_upper( carrid ).

    "Database function selected in database procedure
    TRY.
        NEW cl_demo_amdp_functions_inpcl( )->select_get_scarr_spfli(
          EXPORTING clnt   = sy-mandt
                    carrid = carrid
          IMPORTING scarr_spfli_tab = DATA(result1) ).
      CATCH cx_amdp_error INTO DATA(amdp_error).
        cl_demo_output=>display( amdp_error->get_text( ) ).
        RETURN.
    ENDTRY.

    cl_demo_output=>display( result1 ).

  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  demo=>main( ).

 

上面这事例访问的AMDP
function可以当类CL_DEMO_AMDP_FUNCTIONS_INPCL中看到。

方法GET_SCARR_SPFLI是一个AMDP
function实现,它是匪克一直以ABAP中做客的:

METHOD get_scarr_spfli BY DATABASE FUNCTION FOR HDB
                       LANGUAGE SQLSCRIPT
                       OPTIONS READ-ONLY
                       USING scarr spfli.
  RETURN SELECT sc.carrname, sp.connid, sp.cityfrom, sp.cityto
                FROM scarr AS sc
                  INNER JOIN spfli AS sp ON sc.mandt = sp.mandt AND
                                            sc.carrid = sp.carrid
                  WHERE sp.mandt = :clnt AND sp.carrid = :carrid
                  ORDER BY sc.mandt, sc.carrname, sp.connid;

ENDMETHOD.

 

而方法SELECT_GET_SCARR_SPFLI是一个AMDP
procedure实现,它采取select从上面的function实现中获取数据。代码如下:

METHOD select_get_scarr_spfli
       BY DATABASE PROCEDURE FOR HDB
       LANGUAGE SQLSCRIPT
       OPTIONS READ-ONLY
       USING cl_demo_amdp_functions_inpcl=>get_scarr_spfli.
  SCARR_SPFLI_TAB =
  SELECT *
         FROM "CL_DEMO_AMDP_FUNCTIONS_INPCL=>GET_SCARR_SPFLI"(
                clnt => :clnt,
                carrid => :carrid );
ENDMETHOD.

 

也堪拿AMDP function实现啊CDS table function。这里虽未贴示例了。

 

有关AMDP实现的视频教程:

AMDP异常

AMDP
procedure实现的非常名前缀是CX_AMDP。这些老都当目录CX_DYNAMIC_CHECK之下,必须采取RASING显式地在AMDP
procedure实现的定义着宣称。

CX_ROOT
  |
  |–CX_DYNAMIC_CHECK
       |
       |–CX_AMDP_ERROR
           |
           |–CX_AMDP_VERSION_ERROR
           |    |
           |    |–CX_AMDP_VERSION_MISMATCH
           |
           |–CX_AMDP_CREATION_ERROR
           |    |
           |    |–CX_AMDP_CDS_CLIENT_MISMATCH
           |    |
           |    |–CX_AMDP_DBPROC_GENERATE_FAILED
           |    |
           |    |–CX_AMDP_DBPROC_CREATE_FAILED
           |    |
           |    |–CX_AMDP_NATIVE_DBCALL_FAILED
           |    |
           |    |–CX_AMDP_WRONG_DBSYS
           |
           |–CX_AMDP_EXECUTION_ERROR
           |    |
           |    |–CX_AMDP_EXECUTION_FAILED
           |    |
           |    |–CX_AMDP_IMPORT_TABLE_ERROR
           |    |
           |    |–CX_AMDP_RESULT_TABLE_ERROR
           |
           |–CX_AMDP_CONNECTION_ERROR
                |
                |–CX_AMDP_NO_CONNECTION
                |
                |–CX_AMDP_NO_CONNECTION_FOR_CALL
                |
                |–CX_AMDP_WRONG_CONNECTION

只顾:AMDP
function没有很类。

AMDP异常

AMDP
procedure实现之百般名前缀是CX_AMDP。这些特别且于目录CX_DYNAMIC_CHECK之下,必须使RASING显式地当AMDP
procedure实现之概念着宣示。

CX_ROOT
  |
  |–CX_DYNAMIC_CHECK
       |
       |–CX_AMDP_ERROR
           |
           |–CX_AMDP_VERSION_ERROR
           |    |
           |    |–CX_AMDP_VERSION_MISMATCH
           |
           |–CX_AMDP_CREATION_ERROR
           |    |
           |    |–CX_AMDP_CDS_CLIENT_MISMATCH
           |    |
           |    |–CX_AMDP_DBPROC_GENERATE_FAILED
           |    |
           |    |–CX_AMDP_DBPROC_CREATE_FAILED
           |    |
           |    |–CX_AMDP_NATIVE_DBCALL_FAILED
           |    |
           |    |–CX_AMDP_WRONG_DBSYS
           |
           |–CX_AMDP_EXECUTION_ERROR
           |    |
           |    |–CX_AMDP_EXECUTION_FAILED
           |    |
           |    |–CX_AMDP_IMPORT_TABLE_ERROR
           |    |
           |    |–CX_AMDP_RESULT_TABLE_ERROR
           |
           |–CX_AMDP_CONNECTION_ERROR
                |
                |–CX_AMDP_NO_CONNECTION
                |
                |–CX_AMDP_NO_CONNECTION_FOR_CALL
                |
                |–CX_AMDP_WRONG_CONNECTION

专注:AMDP
function没有异常类。

工具支持

AMDP在SAP NetWeaver AS ABAP 7.40
SP05版本中为引入。只有基于Eclipse的开发工具(即ADT,版本要无低于2.19)才支撑AMDP的编排,SAP
GUI上面的SE80凡匪提供编辑功能的,只能用来阅读代码。

有关AMDP调试的视频教程:

工具支持

AMDP在SAP NetWeaver AS ABAP 7.40
SP05版本中吃引入。只有基于Eclipse的开发工具(即ADT,版本要无低于2.19)才支撑AMDP的编排,SAP
GUI上面的SE80凡无提供编辑功能的,只能用来读书代码。

有关AMDP调试的视频教程:

总结

动用ABAP Managed Database Procedure(AMDP)和CDS开发,属于自上而下的ABAP
for
HANA开发方式。在动用层即ABAP程序中管理数据测算逻辑与建模,激活后会见在HANA中开创相应的数据库对象。相比于原有片Database
Procedure Proxy,AMDP提供了简要的调用SQL Script等数据库语言的方法。

 

参照文章:

[1] AMDP – ABAP Managed Database
Procedures

[2] ABAP Managed Database Procedures –
Introduction

[3] ABAP Development for SAP
HANA

[4] How to use AMDP Function implementation for a CDS Table Function
as a data source in CDS
views

旁资料:

SAP HANA SQL Script
Reference

ABAP CDS Table
Function介绍及示范

 

总结

运用ABAP Managed Database Procedure(AMDP)和CDS开发,属于自上而下的ABAP
for
HANA开发方式。在运用层即ABAP程序中管理数据计算逻辑与建模,激活后会以HANA中开创相应的数据库对象。相比叫原有片Database
Procedure Proxy,AMDP提供了简便易行的调用SQL Script等数据库语言的艺术。

 

参考文章:

[1] AMDP – ABAP Managed Database
Procedures

[2] ABAP Managed Database Procedures –
Introduction

[3] ABAP Development for SAP
HANA

[4] How to use AMDP Function implementation for a CDS Table Function
as a data source in CDS
views

其它资料:

SAP HANA SQL Script
Reference

ABAP CDS Table
Function介绍与示范

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图