日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

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

發(fā)布時(shí)間:2023/12/19 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SAP AMDP介绍 - ABAP托管的HANA数据库过程 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最近Jerry的處境可以用本世紀(jì)初,八零后剛上大學(xué)時(shí)校園內(nèi)風(fēng)靡的一款FPS游戲名稱來(lái)形容: 《半條命》. 為了避免讓汪子熙這個(gè)公眾號(hào)成為神經(jīng)外科前中顱底亞專業(yè)醫(yī)學(xué)知識(shí)的普及號(hào),咱們還是繼續(xù)聊SAP技術(shù)吧。

隨著ABAP 7.40 SP05的發(fā)布,SAP ABAP引入了一種新的應(yīng)用開(kāi)發(fā)范式,即所謂的Code Pushdown.

傳統(tǒng)的ABAP應(yīng)用開(kāi)發(fā)方式,即下圖左邊的Data to Code, 數(shù)據(jù)庫(kù)僅僅作為數(shù)據(jù)的靜態(tài)存儲(chǔ)倉(cāng)庫(kù),ABAP應(yīng)用開(kāi)發(fā)人員通過(guò)Open SQL等方式將數(shù)據(jù)從數(shù)據(jù)庫(kù)層讀取到ABAP應(yīng)用層,再在ABAP應(yīng)用層進(jìn)行數(shù)據(jù)處理。

Code Pushdown意味著一種編程理念的轉(zhuǎn)變,即上圖右邊所示,將密集的數(shù)據(jù)計(jì)算從ABAP應(yīng)用層下推到HANA數(shù)據(jù)庫(kù)層,從而充分發(fā)揮HANA數(shù)據(jù)庫(kù)高性能的數(shù)據(jù)處理能力。

要實(shí)現(xiàn)Code Pushdown,SAP HANA數(shù)據(jù)庫(kù)必須提供一種技術(shù),能夠允許ABAP開(kāi)發(fā)人員在HANA數(shù)據(jù)庫(kù)層直接編寫(xiě)應(yīng)用邏輯。這些應(yīng)用邏輯可以實(shí)現(xiàn)在所謂的數(shù)據(jù)庫(kù)過(guò)程(Database Procedure)里,實(shí)現(xiàn)語(yǔ)言為SAP HANA SQLScript.

我們可以把數(shù)據(jù)庫(kù)過(guò)程簡(jiǎn)單地類比成一個(gè)只能進(jìn)行數(shù)據(jù)庫(kù)讀寫(xiě)及相關(guān)處理的函數(shù),能接收任意多個(gè)輸入?yún)?shù)和定義輸出參數(shù),存放數(shù)據(jù)庫(kù)操作的結(jié)果。參數(shù)的類型既可以是標(biāo)量式類型,比如integer, double, varchar等,也可以是table類型。

使用ABAP Development Tool, 我們可以選擇兩種不同的方式來(lái)實(shí)現(xiàn)數(shù)據(jù)庫(kù)過(guò)程。第一種,即本文標(biāo)題提及的AMDP, 第二種為數(shù)據(jù)庫(kù)過(guò)程代理(Database Procedure Proxy), 不在本文討論范圍之內(nèi)。

AMDP, 顧名思義,即在ABAP層進(jìn)行HANA數(shù)據(jù)庫(kù)過(guò)程的實(shí)現(xiàn)和生命周期(lifecycle)的管理。開(kāi)發(fā)人員通過(guò)位于ABAP層的ABAP Development Tool, 編寫(xiě)HANA SQLScript作為AMDP的實(shí)現(xiàn)體,以此達(dá)到在ABAP層直接消費(fèi)HANA數(shù)據(jù)庫(kù)層原生功能的目的。

具體到實(shí)現(xiàn)環(huán)節(jié),在ABAP層內(nèi)何種類型的開(kāi)發(fā)對(duì)象里編寫(xiě)HANA SQLScript呢?答案仍然是ABAP類的方法內(nèi),只不過(guò)是在一種聲明了特定接口的ABAP類,用AMDP特定的ABAP關(guān)鍵字修飾的方法內(nèi)。繼續(xù)沿用ABAP類方法來(lái)開(kāi)發(fā)AMDP, 使得傳統(tǒng)ABAP應(yīng)用開(kāi)發(fā)人員除了熟悉HANA SQLScript語(yǔ)法外,無(wú)需付出額外的學(xué)習(xí)成本。這種特殊的ABAP類方法,作為HANA SQLScript的承載容器,使得AMDP同其他普通的ABAP開(kāi)發(fā)對(duì)象一樣,采取統(tǒng)一的ABAP傳輸管理,生命周期管理,代碼缺陷修復(fù)和升級(jí)管理方式。

除了AMDP之外,數(shù)據(jù)庫(kù)過(guò)程代理是另一種HANA數(shù)據(jù)庫(kù)過(guò)程的實(shí)現(xiàn)方式。這種方式首先在HANA repository里創(chuàng)建一個(gè)HANA原生的數(shù)據(jù)庫(kù)過(guò)程,再到ABAP層創(chuàng)建一個(gè)代理指向前者,在ABAP應(yīng)用里通過(guò)使用該代理對(duì)象,消費(fèi)HANA倉(cāng)庫(kù)里的原生數(shù)據(jù)庫(kù)過(guò)程。同AMDP相比,這種方式需要在HANA層進(jìn)行原生開(kāi)發(fā),因此在實(shí)際的開(kāi)發(fā)場(chǎng)景中,SAP更推薦使用AMDP.

實(shí)際上AMDP不是一個(gè)新事物,早在2013年這個(gè)功能剛剛隨著ABAP 7.40 SP05發(fā)布之時(shí),我就第一時(shí)間試用并且寫(xiě)了一篇學(xué)習(xí)筆記:

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

看個(gè)具體的例子,還是使用廣大ABAP開(kāi)發(fā)人員喜聞樂(lè)見(jiàn)的SFLIGHT系列模型。

本文例子的完整代碼,可以通過(guò)點(diǎn)擊文末的“閱讀原文”獲得。

首先,AMDP類只能在ABAP Development Tool里進(jìn)行開(kāi)發(fā),在SAP GUI里可以用只讀的方式瀏覽源代碼,但無(wú)法修改:

前面概述章節(jié)里提到,AMDP是實(shí)現(xiàn)在一個(gè)特殊的ABAP類之內(nèi),這個(gè)ABAP類的特殊之處就體現(xiàn)在,它需要聲明一個(gè)Marker Interface(標(biāo)記接口,有的文檔又稱之為T(mén)ag Interface, 標(biāo)簽接口):IF_AMDP_MARKER_HDB.

這個(gè)標(biāo)記接口扮演了現(xiàn)代Java開(kāi)發(fā)中的Annotation的角色,即作為元數(shù)據(jù),告知ABAP編譯期和運(yùn)行時(shí),這個(gè)ABAP類作為容器,存放AMDP的實(shí)現(xiàn)。

順便提一句,除了IF_AMDP_MARKER_HDB,ABAP還有很多其他的標(biāo)記接口,比如表明一個(gè)ABAP類支持序列化操作的接口,IF_SERIALIZABLE_OBJECT:

以及標(biāo)注一個(gè)接口需要被BAdI Definition使用的IF_BADI_INTERFACE. 我們?cè)趧?chuàng)建或修改ABAP新式BAdI時(shí),任何定義在BAdI Definition中的接口,如果沒(méi)有聲明接口IF_BADI_INTERFACE,會(huì)無(wú)法通過(guò)ABAP語(yǔ)法檢查。

因?yàn)锳BAP缺乏像Java那樣能夠從語(yǔ)言級(jí)別直接使用注解(Annotation)進(jìn)行元數(shù)據(jù)定義的特性,因而采用了標(biāo)記接口這種方式。

在Java基于Spring框架的開(kāi)發(fā)里,Annotation幾乎隨處可見(jiàn)。JDK1.5之后引入的Annotation,能聲明在Java包、類、字段、方法、局部變量、方法參數(shù)等資源之上,達(dá)到維護(hù)元數(shù)據(jù)的目的,既靈活又方便。然而Java誕生之初,在JDK1.5之前,標(biāo)記接口也是Java唯一能夠從語(yǔ)言層級(jí)進(jìn)行元數(shù)據(jù)維護(hù)的方式。

下圖是Java用來(lái)定義一個(gè)類能夠支持序列化操作的標(biāo)記接口Serializable, 對(duì)應(yīng)著ABAP的標(biāo)記接口IF_SERIALIZABLE_OBJECT.

再回到本文的例子ZCL_JERRY_AMDP_DEMO, main方法里就執(zhí)行一個(gè)邏輯:從SFLIGHTS系列的模型里讀取數(shù)據(jù)。

方法get_flights從數(shù)據(jù)庫(kù)表里讀取數(shù)據(jù),然后調(diào)用另一個(gè)方法convert_currency,直接在HANA數(shù)據(jù)庫(kù)層面進(jìn)行貨幣轉(zhuǎn)換,再把結(jié)果返回給ABAP層的輸出參數(shù)result.

前面提到過(guò),AMDP實(shí)現(xiàn)在一個(gè)特殊ABAP類的特殊方法里。特殊的ABAP類,前文已經(jīng)介紹過(guò),該類必須聲明標(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方法是一個(gè)AMDP的容器,AMDP的實(shí)現(xiàn)語(yǔ)言為HANA SQLScript,實(shí)現(xiàn)體內(nèi)以只讀方式訪問(wèn)了兩張數(shù)據(jù)庫(kù)表/dmo/flight和/dmo/carrier, 以及另一個(gè)實(shí)現(xiàn)貨幣轉(zhuǎn)換功能的名為convert_currency的AMDP.

這個(gè)AMDP的邏輯主要是接收之前從/dmo/flight和/dmo/carrier兩張表做內(nèi)連接后得到的數(shù)據(jù)作為輸入,同時(shí)消費(fèi)HANA SQLScript里一個(gè)內(nèi)置函數(shù)convert_currency, 將數(shù)據(jù)庫(kù)里的機(jī)票價(jià)格轉(zhuǎn)換成以歐元EUR為單位的值。

convert_currency函數(shù)的參數(shù)定義:

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

執(zhí)行結(jié)果:

大家可以點(diǎn)擊下面的“閱讀原文”獲得這個(gè)例子的完全源代碼,用ABAP Development Tool登錄ABAP On-Premises系統(tǒng)(數(shù)據(jù)庫(kù)必須是HANA,ABAP版本必須是7.40 SP05及以上),或者通過(guò)Jerry之前文章 ABAP開(kāi)發(fā)者上云的時(shí)候到了 - 現(xiàn)在大家可以免費(fèi)使用SAP云平臺(tái)ABAP環(huán)境的試用版了 介紹的辦法,申請(qǐng)免費(fèi)的SAP云平臺(tái)ABAP編程環(huán)境,進(jìn)行AMDP開(kāi)發(fā)的嘗試。

后續(xù)Jerry有時(shí)間會(huì)介紹AMDP的調(diào)試和性能分析等內(nèi)容,感謝閱讀。

要獲取更多Jerry的原創(chuàng)文章,請(qǐng)關(guān)注公眾號(hào)"汪子熙":

總結(jié)

以上是生活随笔為你收集整理的SAP AMDP介绍 - ABAP托管的HANA数据库过程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。