zoukankan      html  css  js  c++  java
  • ABAP中的AMDP(ABAP-Managed Database Procedures )

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

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

    本文链接: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进行运行时错误的详细分析    

    介绍视频

    几种数据库访问方式的区别(Open SQL, AMDP, ABAP-Managed Native SQL, Non-ABAP-Managed Native SQL):

      ABAP类型和数据库类型间的映射
    数据库对象的存在Existence of the Database Objects,
    ABAP特定的环境信息
    使用位置列表Where-Used List
    ABAP托管数据库连接支持 Mapping of field order,
    forbiddance of DDL
    Client处理,
    表缓存,
    表日志,
    CDS Entities, …
    Open SQL  Yes  Yes  Yes  Yes
    AMDP  Yes  Restricted  Yes  No
    ABAP-Managed Native SQL  Restricted  Yes  No  No
    Non-ABAP-Managed Native SQL  No  No  No  No

    语法

    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 ). 

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

    示例代码:

    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在SAP NetWeaver AS ABAP 7.40 SP05版本中被引入。只有基于Eclipse的开发工具(即ADT,版本要不低于2.19)才支持AMDP的编辑,SAP GUI上面的SE80是不提供编辑功能的,只能用来阅读代码。

    调试工具情看这篇文章:Tutorial: How to Debug an ABAP Managed Database Procedure

    有关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

    [5] ABAP-Managed Database Objects and How to Access Them

    其他资料:

    SAP HANA SQL Script Reference

    ABAP CDS Table Function介绍与示例

     
  • 相关阅读:
    webrtc源码分析-视频发送流程
    webrtc源码分析-Api接口
    webrtc源码分析-线程任务管理
    webrtc源码分析- jitter delay计算详解
    傅里叶变换
    从贝叶斯到卡尔曼滤波
    sql---case...when...
    python---collections模块记录(defaultdict, namedtuple, ChainMap)
    宏判断是否为Excel打开,若不是则关闭表格
    Golang混淆
  • 原文地址:https://www.cnblogs.com/hhelibeb/p/7976533.html
Copyright © 2011-2022 走看看