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
其他資料: