天天看點

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
AMDP  Restricted  No
ABAP-Managed Native SQL
Non-ABAP-Managed Native SQL

文法

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介紹與示例

繼續閱讀