SAP AMDP介绍 - ABAP托管的HANA数据库过程

最近Jerry的处境可以用本世纪初,八零后刚上大学时校园内风靡的一款FPS游戏名称来形容: 《半条命》. 为了避免让汪子熙这个公众号成为神经外科前中颅底亚专业医学知识的普及号,咱们还是继续聊SAP技术吧。

随着ABAP 7.40 SP05的发布,SAP ABAP引入了一种新的应用开发范式,即所谓的Code Pushdown.

传统的ABAP应用开发方式,即下图左边的Data to Code, 数据库仅仅作为数据的静态存储仓库,ABAP应用开发人员通过Open SQL等方式将数据从数据库层读取到ABAP应用层,再在ABAP应用层进行数据处理。

Code Pushdown意味着一种编程理念的转变,即上图右边所示,将密集的数据计算从ABAP应用层下推到HANA数据库层,从而充分发挥HANA数据库高性能的数据处理能力。

要实现Code Pushdown,SAP HANA数据库必须提供一种技术,能够允许ABAP开发人员在HANA数据库层直接编写应用逻辑。这些应用逻辑可以实现在所谓的数据库过程(Database Procedure)里,实现语言为SAP HANA SQLScript.

我们可以把数据库过程简单地类比成一个只能进行数据库读写及相关处理的函数,能接收任意多个输入参数和定义输出参数,存放数据库操作的结果。参数的类型既可以是标量式类型,比如integer, double, varchar等,也可以是table类型。

使用ABAP Development Tool, 我们可以选择两种不同的方式来实现数据库过程。第一种,即本文标题提及的AMDP, 第二种为数据库过程代理(Database Procedure Proxy), 不在本文讨论范围之内。

AMDP, 顾名思义,即在ABAP层进行HANA数据库过程的实现和生命周期(lifecycle)的管理。开发人员通过位于ABAP层的ABAP Development Tool, 编写HANA SQLScript作为AMDP的实现体,以此达到在ABAP层直接消费HANA数据库层原生功能的目的。

具体到实现环节,在ABAP层内何种类型的开发对象里编写HANA SQLScript呢?答案仍然是ABAP类的方法内,只不过是在一种声明了特定接口的ABAP类,用AMDP特定的ABAP关键字修饰的方法内。继续沿用ABAP类方法来开发AMDP, 使得传统ABAP应用开发人员除了熟悉HANA SQLScript语法外,无需付出额外的学习成本。这种特殊的ABAP类方法,作为HANA SQLScript的承载容器,使得AMDP同其他普通的ABAP开发对象一样,采取统一的ABAP传输管理,生命周期管理,代码缺陷修复和升级管理方式。

除了AMDP之外,数据库过程代理是另一种HANA数据库过程的实现方式。这种方式首先在HANA repository里创建一个HANA原生的数据库过程,再到ABAP层创建一个代理指向前者,在ABAP应用里通过使用该代理对象,消费HANA仓库里的原生数据库过程。同AMDP相比,这种方式需要在HANA层进行原生开发,因此在实际的开发场景中,SAP更推荐使用AMDP.

实际上AMDP不是一个新事物,早在2013年这个功能刚刚随着ABAP 7.40 SP05发布之时,我就第一时间试用并且写了一篇学习笔记:

https://blogs.sap.com/2013/12/10/an-example-of-amdp-abap-managed-database-procedure-in-740/

看个具体的例子,还是使用广大ABAP开发人员喜闻乐见的SFLIGHT系列模型。

本文例子的完整代码,可以通过点击文末的“阅读原文”获得。

首先,AMDP类只能在ABAP Development Tool里进行开发,在SAP GUI里可以用只读的方式浏览源代码,但无法修改:

前面概述章节里提到,AMDP是实现在一个特殊的ABAP类之内,这个ABAP类的特殊之处就体现在,它需要声明一个Marker Interface(标记接口,有的文档又称之为Tag Interface, 标签接口):IF_AMDP_MARKER_HDB.

这个标记接口扮演了现代Java开发中的Annotation的角色,即作为元数据,告知ABAP编译期和运行时,这个ABAP类作为容器,存放AMDP的实现。

顺便提一句,除了IF_AMDP_MARKER_HDB,ABAP还有很多其他的标记接口,比如表明一个ABAP类支持序列化操作的接口,IF_SERIALIZABLE_OBJECT:

以及标注一个接口需要被BAdI Definition使用的IF_BADI_INTERFACE. 我们在创建或修改ABAP新式BAdI时,任何定义在BAdI Definition中的接口,如果没有声明接口IF_BADI_INTERFACE,会无法通过ABAP语法检查。

因为ABAP缺乏像Java那样能够从语言级别直接使用注解(Annotation)进行元数据定义的特性,因而采用了标记接口这种方式。

在Java基于Spring框架的开发里,Annotation几乎随处可见。JDK1.5之后引入的Annotation,能声明在Java包、类、字段、方法、局部变量、方法参数等资源之上,达到维护元数据的目的,既灵活又方便。然而Java诞生之初,在JDK1.5之前,标记接口也是Java唯一能够从语言层级进行元数据维护的方式。

下图是Java用来定义一个类能够支持序列化操作的标记接口Serializable, 对应着ABAP的标记接口IF_SERIALIZABLE_OBJECT.

再回到本文的例子ZCL_JERRY_AMDP_DEMO, main方法里就执行一个逻辑:从SFLIGHTS系列的模型里读取数据。

方法get_flights从数据库表里读取数据,然后调用另一个方法convert_currency,直接在HANA数据库层面进行货币转换,再把结果返回给ABAP层的输出参数result.

前面提到过,AMDP实现在一个特殊ABAP类的特殊方法里。特殊的ABAP类,前文已经介绍过,该类必须声明标记接口IF_AMDP_MARKER_HDB. 而AMDP方法同普通ABAP方法相比的特殊之处,体现在BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT这些ABAP关键字上:

上图红色区域的ABAP关键字,表明被修饰的ABAP方法是一个AMDP的容器,AMDP的实现语言为HANA SQLScript,实现体内以只读方式访问了两张数据库表/dmo/flight和/dmo/carrier, 以及另一个实现货币转换功能的名为convert_currency的AMDP.

这个AMDP的逻辑主要是接收之前从/dmo/flight和/dmo/carrier两张表做内连接后得到的数据作为输入,同时消费HANA SQLScript里一个内置函数convert_currency, 将数据库里的机票价格转换成以欧元EUR为单位的值。

convert_currency函数的参数定义:

https://help.sap.com/viewer/4fe29514fd584807ac9f2a04f6754767/2.0.03/en-US/d22d746ed2951014bb7fb0114ffdaf96.html

执行结果:


大家可以点击下面的“阅读原文”获得这个例子的完全源代码,用ABAP Development Tool登录ABAP On-Premises系统(数据库必须是HANA,ABAP版本必须是7.40 SP05及以上),或者通过Jerry之前文章 ABAP开发者上云的时候到了 - 现在大家可以免费使用SAP云平台ABAP环境的试用版了 介绍的办法,申请免费的SAP云平台ABAP编程环境,进行AMDP开发的尝试。

后续Jerry有时间会介绍AMDP的调试和性能分析等内容,感谢阅读。

要获取更多Jerry的原创文章,请关注公众号"汪子熙":


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269