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

其他资料:

SAP HANA SQL Script Reference

ABAP CDS Table Function介绍与示例

 

ABAP中的AMDP(ABAP-Managed Database Procedures )的更多相关文章

  1. 【ABAP CDS系列】ABAP CDS中的系统信息

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP CDS系列]ABAP CDS中的系统 ...

  2. 【ABAP系列】SAP ABAP 带有参数的AMDP的创建

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 带有参数的AM ...

  3. 理解CSV文件以及ABAP中的相关操作

    在很多ABAP开发中,我们使用CSV文件,有时候,关于CSV文件本身的一些问题使人迷惑.它仅仅是一种被逗号分割的文本文档吗? 让我们先来看看接下来可能要处理的几个相关组件的词汇的语义. Separat ...

  4. ABAP中使用浏览器打开网页

    在SAP ABAP中可以在Screen中嵌入Html control打开网页,也可以通过调用本地的IE浏览器打开. 1.在Screen中嵌入Html control的例子,在系统中有,se38:SAP ...

  5. 字符串处理:ABAP中的正则表达式

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  6. ABAP 中的搜索帮助

    ABAP 中的搜索帮助 https://blog.csdn.net/u011576750/article/details/50999078 一.简介:在abap中,用到的搜索帮助个人遇到的情况如下,进 ...

  7. ABAP 中JSON格式的转换与解析

    RT,JSON是当今十分流行的一种轻量数据格式,广泛地应用于各种数据交换场景中.本文会介绍一种比较简单的将ABAP中的数据转换为JSON格式的方法. (如果你是因为引号的问题搜索到了这篇文章,请直接拉 ...

  8. 【ABAP系列】SAP ABAP 开发中的SMARTFORMS 参数

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 开发中的SMA ...

  9. 【ABAP系列】SAP ABAP中ALV使用HTML的例子

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP中ALV使用HT ...

随机推荐

  1. 2D特效和3D特效

    2D居中效果 div{ width: height: backgroundcolor: position:absolute; left:50%; top:50%; transform:translat ...

  2. PHP设计模式三:原型设计模式

    一.什么是原型设计模式 原型设计模式使用一种克隆技术来复制实例化的对象,新对象是通过复制原型实例创建的.原型设计模式的目的是通过使用克隆以减少 实例化对象的开销. 在原型设计模式中,Client类是不 ...

  3. JF厂V8版本爱彼AP15703,黄家橡树离岸型,超越N厂神器

    根据调查的结果JF厂的爱彼AP15703几乎常年垄断了爱彼的市场,销量持续性的排在爱彼整个品牌中的第一位.JF厂这两年一直在攻克爱彼整个品牌,有了解的都知道 爱彼15703以前是N厂的五大复刻神器的代 ...

  4. 进程,线程,GIL,Python多线程,生产者消费者模型都是什么鬼

    1. 操作系统基本知识,进程,线程 CPU是计算机的核心,承担了所有的计算任务: 操作系统是计算机的管理者,它负责任务的调度.资源的分配和管理,统领整个计算机硬件:那么操作系统是如何进行任务调度的呢? ...

  5. .4-Vue源码之数据劫持(2)

    开播了开播了! vue通过数据劫持来达到监听和操作DOM更新,上一节简述了数组变化是如何监听的,这一节先讲讲对象属性是如何劫持的. // Line-855 Observer.prototype.wal ...

  6. 前端开发:如何写一手漂亮的 Vue

    前几日听到一句生猛与激励并存,可怕与尴尬同在,最无奈也无解的话:"90后,你的中年危机已经杀到".这令我很受触动.显然,这有些夸张了,但就目前这日复一日的庸碌下去,眨眼的功夫,那情 ...

  7. hdu1285 确定比赛名次(拓扑排序)

    有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道 ...

  8. HDU6127Hard challenge

    Hard challenge Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others) ...

  9. poj 1254 Hansel and Grethel

    Hansel and Grethel Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2199   Accepted: 100 ...

  10. html网页中加载js脚本 下载下来是乱码(文件编码格式)

    问题描述: 在一个index.html网页中,引入了jquery脚本,但是却出现错误,提示$ is not defined <!DOCTYPE html> <html lang=&q ...