ABAP中的AMDP(ABAP-Managed Database Procedures )

ABAP託管數據庫過程(ABAP-Managed Database Procedure,如下簡稱AMDP)是在APAP on SAP HANA開發中的一種優化模式。AMDP使用數據庫語言書寫,好比Native SQL或者是SQL Script,而且在AMDP類的AMDP方法內實現。所以用它開發數據庫過程就有點相似於編輯ABAP類。html

簡而言之,AMDP容許開發者直接在ABAP中寫數據庫過程。sql

 

本文連接:http://www.cnblogs.com/hhelibeb/p/7976533.html數據庫

轉載請註明緩存

爲何使用AMDP?

按SAP的官方建議,在可使用Open SQL實現須要的功能或優化目標的時候,不建議使用AMDP。而在須要使用Open SQL不支持的特性,或者是大量處理流和分析致使了數據庫和應用服務器之間有重複的大量數據傳輸的狀況下,則應當使用AMDP。服務器

具體的例子能夠看看:AMDP, Comparison of SQLScript with Open SQL ,app

          SAP HANA, Currency Conversion with SQLScript    ide

AMDP還能提供如下好處:工具

  • SQL Script的靜態代碼檢查
  • 語法高亮(支持pretty printer格式優化器) 
  • 在AMDP內訪問其它AMDP方法、ABAP字典的視圖和表 
  • 能夠像普通的ABAP方法同樣調用(不包括AMDP function)  
  • 使用ST22進行運行時錯誤的詳細分析    

介紹視頻post

幾種數據庫訪問方式的區別(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介紹與示例

相關文章
相關標籤/搜索