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
转载请注明
按SAP的官方建议,在可以使用Open SQL实现需要的功能或优化目标的时候,不建议使用AMDP。而在需要使用Open SQL不存在的特性,或者是大量处理流和分析导致了数据库和应用服务器之间有重复的大量数据传输的情况下,则应当使用AMDP。
具体的例子可以看看:AMDP, Comparison of SQLScript with Open SQL ,
SAP HANA, Currency Conversion with SQLScript
AMDP还能提供以下好处:
介绍视频:
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_
示例类CL_DEMO_AMDP_SCARR绑定了接口IF_AMDP_MARKER_HDB,并且包含AMDP方法SELECT_SCARR来从表SCARR中获取数据:
- 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.
以下代码可以用来调用方法、获取结果:
- DATA result TYPE cl_demo_amdp_scarr=>scarr_tab.
- NEW cl_demo_amdp_scarr( )->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是不提供编辑功能的,只能用来阅读代码。
有关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
其他资料:
SAP HANA SQL Script Reference
来源: http://www.cnblogs.com/hhelibeb/p/7976533.html