ABAP中的AMDP(ABAP-Managed Database Procedures )

主页 » SAP文库 » ABAP

作者 氢氦 2018-03-13    729

目录

  • 为什么使用AMDP?

  • 语法

  • 简单示例

  • AMDP方法

    • AMDP procedure实现

    • AMDP function实现

  • AMDP异常

  • 工具支持

  • 总结

 

正文

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

简而言之,AMDP允许开发者直接在ABAP中写数据库存储过程。

 

为什么使用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  DEFINITION.  PUBLIC SECTION.* 指定的Marker接口
  INTERFACES IF_AMDP_MARKER_.
   ...       
  METHODS .
   ...     
ENDCLASS.CLASS  IMPLEMENTATION.

...* AMDP 方法 
  METHOD  BY DATABASE PROCEDURE 
        FOR         LANGUAGE 
         OPTIONS   
         USING   .         
      "使用数据库语言实现存储过程     ...  ENDMETHOD.
    ...ENDCLASS.

复制代码

AMDP类就是普通的类,并实现IF_AMDP_MARKER_接口。如果是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 ).

复制代码


AMDP方法

AMDP方法有两种实现,一种是AMDP procedure实现;另一种是AMDP function实现。

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可以在与数据库表或者视图相同的位置使用。

 

示例代码:

复制代码

 demo  - demo   cl_abap_dbfeatures=>==>=>=> carrid  s_carr_id VALUE =>request(  field ==
     cl_demo_amdp_functions_inpcl( )-> clnt   = sy-= scarr_spfli_tab =  cx_amdp_error  =>display( amdp_error->=>=>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 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是不提供编辑功能的,只能用来阅读代码。



总结

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

 

本文原始地址:http://sapdoc.cn/sap/theme/181.html

转载请注明出处来自 SAP文库

上一篇

AA固定资产|概述

下一篇

一个完整的SAP RFC调用接口封装