SAP AMDP介绍 - ABAP托管的HANA数据库过程
最近Jerry的處境可以用本世紀(jì)初,八零后剛上大學(xué)時校園內(nèi)風(fēng)靡的一款FPS游戲名稱來形容: 《半條命》. 為了避免讓汪子熙這個公眾號成為神經(jīng)外科前中顱底亞專業(yè)醫(yī)學(xué)知識的普及號,咱們還是繼續(xù)聊SAP技術(shù)吧。
隨著ABAP 7.40 SP05的發(fā)布,SAP ABAP引入了一種新的應(yīng)用開發(fā)范式,即所謂的Code Pushdown.
傳統(tǒng)的ABAP應(yīng)用開發(fā)方式,即下圖左邊的Data to Code, 數(shù)據(jù)庫僅僅作為數(shù)據(jù)的靜態(tài)存儲倉庫,ABAP應(yīng)用開發(fā)人員通過Open SQL等方式將數(shù)據(jù)從數(shù)據(jù)庫層讀取到ABAP應(yīng)用層,再在ABAP應(yīng)用層進(jìn)行數(shù)據(jù)處理。
Code Pushdown意味著一種編程理念的轉(zhuǎn)變,即上圖右邊所示,將密集的數(shù)據(jù)計算從ABAP應(yīng)用層下推到HANA數(shù)據(jù)庫層,從而充分發(fā)揮HANA數(shù)據(jù)庫高性能的數(shù)據(jù)處理能力。
要實現(xiàn)Code Pushdown,SAP HANA數(shù)據(jù)庫必須提供一種技術(shù),能夠允許ABAP開發(fā)人員在HANA數(shù)據(jù)庫層直接編寫應(yīng)用邏輯。這些應(yīng)用邏輯可以實現(xiàn)在所謂的數(shù)據(jù)庫過程(Database Procedure)里,實現(xiàn)語言為SAP HANA SQLScript.
我們可以把數(shù)據(jù)庫過程簡單地類比成一個只能進(jìn)行數(shù)據(jù)庫讀寫及相關(guān)處理的函數(shù),能接收任意多個輸入?yún)?shù)和定義輸出參數(shù),存放數(shù)據(jù)庫操作的結(jié)果。參數(shù)的類型既可以是標(biāo)量式類型,比如integer, double, varchar等,也可以是table類型。
使用ABAP Development Tool, 我們可以選擇兩種不同的方式來實現(xiàn)數(shù)據(jù)庫過程。第一種,即本文標(biāo)題提及的AMDP, 第二種為數(shù)據(jù)庫過程代理(Database Procedure Proxy), 不在本文討論范圍之內(nèi)。
AMDP, 顧名思義,即在ABAP層進(jìn)行HANA數(shù)據(jù)庫過程的實現(xiàn)和生命周期(lifecycle)的管理。開發(fā)人員通過位于ABAP層的ABAP Development Tool, 編寫HANA SQLScript作為AMDP的實現(xiàn)體,以此達(dá)到在ABAP層直接消費HANA數(shù)據(jù)庫層原生功能的目的。
具體到實現(xiàn)環(huán)節(jié),在ABAP層內(nèi)何種類型的開發(fā)對象里編寫HANA SQLScript呢?答案仍然是ABAP類的方法內(nèi),只不過是在一種聲明了特定接口的ABAP類,用AMDP特定的ABAP關(guān)鍵字修飾的方法內(nèi)。繼續(xù)沿用ABAP類方法來開發(fā)AMDP, 使得傳統(tǒng)ABAP應(yīng)用開發(fā)人員除了熟悉HANA SQLScript語法外,無需付出額外的學(xué)習(xí)成本。這種特殊的ABAP類方法,作為HANA SQLScript的承載容器,使得AMDP同其他普通的ABAP開發(fā)對象一樣,采取統(tǒng)一的ABAP傳輸管理,生命周期管理,代碼缺陷修復(fù)和升級管理方式。
除了AMDP之外,數(shù)據(jù)庫過程代理是另一種HANA數(shù)據(jù)庫過程的實現(xiàn)方式。這種方式首先在HANA repository里創(chuàng)建一個HANA原生的數(shù)據(jù)庫過程,再到ABAP層創(chuàng)建一個代理指向前者,在ABAP應(yīng)用里通過使用該代理對象,消費HANA倉庫里的原生數(shù)據(jù)庫過程。同AMDP相比,這種方式需要在HANA層進(jìn)行原生開發(fā),因此在實際的開發(fā)場景中,SAP更推薦使用AMDP.
實際上AMDP不是一個新事物,早在2013年這個功能剛剛隨著ABAP 7.40 SP05發(fā)布之時,我就第一時間試用并且寫了一篇學(xué)習(xí)筆記:
https://blogs.sap.com/2013/12/10/an-example-of-amdp-abap-managed-database-procedure-in-740/
看個具體的例子,還是使用廣大ABAP開發(fā)人員喜聞樂見的SFLIGHT系列模型。
本文例子的完整代碼,可以通過點擊文末的“閱讀原文”獲得。
首先,AMDP類只能在ABAP Development Tool里進(jìn)行開發(fā),在SAP GUI里可以用只讀的方式瀏覽源代碼,但無法修改:
前面概述章節(jié)里提到,AMDP是實現(xiàn)在一個特殊的ABAP類之內(nèi),這個ABAP類的特殊之處就體現(xiàn)在,它需要聲明一個Marker Interface(標(biāo)記接口,有的文檔又稱之為Tag Interface, 標(biāo)簽接口):IF_AMDP_MARKER_HDB.
這個標(biāo)記接口扮演了現(xiàn)代Java開發(fā)中的Annotation的角色,即作為元數(shù)據(jù),告知ABAP編譯期和運行時,這個ABAP類作為容器,存放AMDP的實現(xiàn)。
順便提一句,除了IF_AMDP_MARKER_HDB,ABAP還有很多其他的標(biāo)記接口,比如表明一個ABAP類支持序列化操作的接口,IF_SERIALIZABLE_OBJECT:
以及標(biāo)注一個接口需要被BAdI Definition使用的IF_BADI_INTERFACE. 我們在創(chuàng)建或修改ABAP新式BAdI時,任何定義在BAdI Definition中的接口,如果沒有聲明接口IF_BADI_INTERFACE,會無法通過ABAP語法檢查。
因為ABAP缺乏像Java那樣能夠從語言級別直接使用注解(Annotation)進(jìn)行元數(shù)據(jù)定義的特性,因而采用了標(biāo)記接口這種方式。
在Java基于Spring框架的開發(fā)里,Annotation幾乎隨處可見。JDK1.5之后引入的Annotation,能聲明在Java包、類、字段、方法、局部變量、方法參數(shù)等資源之上,達(dá)到維護(hù)元數(shù)據(jù)的目的,既靈活又方便。然而Java誕生之初,在JDK1.5之前,標(biāo)記接口也是Java唯一能夠從語言層級進(jìn)行元數(shù)據(jù)維護(hù)的方式。
下圖是Java用來定義一個類能夠支持序列化操作的標(biāo)記接口Serializable, 對應(yīng)著ABAP的標(biāo)記接口IF_SERIALIZABLE_OBJECT.
再回到本文的例子ZCL_JERRY_AMDP_DEMO, main方法里就執(zhí)行一個邏輯:從SFLIGHTS系列的模型里讀取數(shù)據(jù)。
方法get_flights從數(shù)據(jù)庫表里讀取數(shù)據(jù),然后調(diào)用另一個方法convert_currency,直接在HANA數(shù)據(jù)庫層面進(jìn)行貨幣轉(zhuǎn)換,再把結(jié)果返回給ABAP層的輸出參數(shù)result.
前面提到過,AMDP實現(xiàn)在一個特殊ABAP類的特殊方法里。特殊的ABAP類,前文已經(jīng)介紹過,該類必須聲明標(biāo)記接口IF_AMDP_MARKER_HDB. 而AMDP方法同普通ABAP方法相比的特殊之處,體現(xiàn)在BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT這些ABAP關(guān)鍵字上:
上圖紅色區(qū)域的ABAP關(guān)鍵字,表明被修飾的ABAP方法是一個AMDP的容器,AMDP的實現(xiàn)語言為HANA SQLScript,實現(xiàn)體內(nèi)以只讀方式訪問了兩張數(shù)據(jù)庫表/dmo/flight和/dmo/carrier, 以及另一個實現(xiàn)貨幣轉(zhuǎn)換功能的名為convert_currency的AMDP.
這個AMDP的邏輯主要是接收之前從/dmo/flight和/dmo/carrier兩張表做內(nèi)連接后得到的數(shù)據(jù)作為輸入,同時消費HANA SQLScript里一個內(nèi)置函數(shù)convert_currency, 將數(shù)據(jù)庫里的機票價格轉(zhuǎn)換成以歐元EUR為單位的值。
convert_currency函數(shù)的參數(shù)定義:
https://help.sap.com/viewer/4fe29514fd584807ac9f2a04f6754767/2.0.03/en-US/d22d746ed2951014bb7fb0114ffdaf96.html
執(zhí)行結(jié)果:
大家可以點擊下面的“閱讀原文”獲得這個例子的完全源代碼,用ABAP Development Tool登錄ABAP On-Premises系統(tǒng)(數(shù)據(jù)庫必須是HANA,ABAP版本必須是7.40 SP05及以上),或者通過Jerry之前文章 ABAP開發(fā)者上云的時候到了 - 現(xiàn)在大家可以免費使用SAP云平臺ABAP環(huán)境的試用版了 介紹的辦法,申請免費的SAP云平臺ABAP編程環(huán)境,進(jìn)行AMDP開發(fā)的嘗試。
后續(xù)Jerry有時間會介紹AMDP的調(diào)試和性能分析等內(nèi)容,感謝閱讀。
要獲取更多Jerry的原創(chuàng)文章,請關(guān)注公眾號"汪子熙":
總結(jié)
以上是生活随笔為你收集整理的SAP AMDP介绍 - ABAP托管的HANA数据库过程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 抖音石头剪刀布一把十手倒过来念是什么梗
- 下一篇: MySQL社区版的下载和安装