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數據庫
轉載請註明緩存
按SAP的官方建議,在可使用Open SQL實現須要的功能或優化目標的時候,不建議使用AMDP。而在須要使用Open SQL不支持的特性,或者是大量處理流和分析致使了數據庫和應用服務器之間有重複的大量數據傳輸的狀況下,則應當使用AMDP。服務器
具體的例子能夠看看:AMDP, Comparison of SQLScript with Open SQL ,app
SAP HANA, Currency Conversion with SQLScript ide
AMDP還能提供如下好處:工具
介紹視頻: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 procedure實現;另外一種是AMDP function實現。
須要使用Method語句的附加項BY DATABASE PROCEDURE。例子見上文。這種實現方式寫成的方法和普通的ABAP對象方法在使用方式上沒區別。
須要使用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 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
其餘資料: