SAP AMDP介紹 - ABAP託管的HANA資料庫過程

2020-12-18 汪子熙的編程和遊泳

這是Jerry 2020年的第67篇文章,也是汪子熙公眾號總共第249篇原創文章。

最近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

執行結果:

相關焦點

  • SAP ABAP Netweaver伺服器的標準登錄方式講解
    本文繼續介紹ABAP裡的一個知識點:ABAP Netweaver伺服器的登錄方式(Standard Logon Procedure).例如直接在瀏覽器裡打開某Web Service的WSDL url:http://<XXXX>:50078/sap/bc/srt/wsdl/flv_10002A111AD1/bndg_url/sap/bc/srt/rfc/sap/zws_add/506/zjerry1/jerry1?
  • SAP ABAP和Java裡的弱引用(WeakReference)和軟引用(SoftReference)
    Jerry前一篇文章 SAP ABAP一組關鍵字 IS BOUND, IS NOT INITIAL和IS ASSIGNED的用法辨析介紹了在ABAP裡判斷引用變量是否包含了一個有效引用的關鍵字:IS BOUND.
  • SAP官方到底提供了免費的S4HANA試用版沒有?
    作為SAP員工,我能給的答覆就是這篇SAP社區的博客:SAP S/4HANA Fully-Activated Appliance: Create your SAP S/4HANA system in a fraction of the usual setup timehttps://blogs.sap.com
  • 雲資料庫市場再起風雲,SAP HANA Cloud正式落地阿里雲
    如果在10年前,業界對於內存計算還有懷疑的話,如今SAP HANA已經成為資料庫翹楚,連續進入Gartner全球資料庫魔力象限領導者陣營,積累了32000家客戶並成為了SAP智慧企業願景的基石。Gartner預測,到2022年,全球資料庫的75%將遷移到雲平臺上或直接部署在雲端。2020年12月15日,在2020 SAP TechED之際,SAP宣布SAP HANA Cloud落地阿里雲,而中國雲資料庫市場之競爭已經日趨激烈,SAP的加入將讓中國雲資料庫市場再起風雲。
  • 一個用於SAP UI5學習的腳手架應用,沒有任何後臺API的依賴
    button控制項的SAP UI5頁面:可以用任何文本編輯器打開這個文件夾,該頁面的原始碼在walkthrough子文件夾的index.html裡:上圖高亮部分的原始碼,即SAP UI5 button控制項的創建代碼,可以直接從下面SAP UI5官網上拷貝獲得:https://sapui5.hana.ondemand.com
  • ABAP vs Java, 蛙泳 vs 自由式
    語言特性這個公眾號有很多關注者是學生朋友,因此還是有必要簡單介紹下ABAP。具體例子可以看我的博客:Functional Programming – Try Reduce in JavaScript and in ABAPhttps://blogs.sap.com/2017/02/27/functional-programming-try-reduce-in-javascript-and-in-abap/另一方面,我的很多同事戲稱
  • SAP HANA Cloud數據平臺亮相TechEd,已部署阿里雲
    然而,SAP HANA Cloud資料庫幫助企業實現這個目標。SAP執行董事會成員、SAP首席技術官穆悅庚(Juergen Mueller)以兩家虛擬公司為例進行了介紹。這就是SAP HANA Cloud可以順利連接並遠程其他任何資料庫,並且將所有資料庫表整合一起的功能。SAP HANA Cloud可以訪問和處理的數據超過了TB級,即使PB級的數據也不在話下;要強調的是,無論是數據類型是結構化的、半結構化的還是非結構化的。看得出來,集靈活性、可擴展性和連接性於一體的SAP HANA Cloud對於那些併購、整合的集團來說意義重大。
  • 黑客洩露暗網託管服務商DH資料庫 涉及七千多個帳戶密碼
    站長之家(ChinaZ.com) 6月1日 消息:據外媒報導,一名黑客日前在網上洩露了全球最大的免費暗網託管服務商Daniel's Hosting (DH)的資料庫。
  • 美國伺服器託管業務介紹
    今天小編就跟大家介紹一下美國伺服器託管業務。進行美國伺服器託管業務的用戶,在與美國伺服器託管商合作前都會籤訂雙方關於美國伺服器託管合作上雙方一致認可的美國伺服器託管合同,合同具體內容對合作雙方的責任和義務會有明確的條款說明。
  • SAP TechEd全球技術大會在線開啟,SAP HANA Cloud強勢落地阿里雲
    SAP執行董事會成員、首席技術官穆悅庚(Juergen Mueller) SAP執行董事會成員、首席技術官穆悅庚(Juergen Mueller)在主旨演講中介紹了 李瑞成博士介紹未來六大技術趨勢SAP HANA Cloud 融合雲服務的擴展能力,和內存資料庫的高速運算能力,為企業提供統一的數據存儲、訪問和分析支持,以及靈活的混合部署方案,並通過引入最佳實踐,引領中國企業將數據遷移到雲端,駕御數據力量,釋放數據價值,推動企業數位化轉型。此外 ,SAP面向全球開發人員發布了新的工具、更新和服務。
  • 十年新起點,SAP HANA Cloud再啟航,正式落地阿里雲
    資料庫的上雲之路 1970 年,關係資料庫之父、IBM研究員E.F.Codd發表了一篇名為「A Relational Modelof Datafor Large Shared Data Banks」的論文,首次提出了關係模型的概念,並成為現代資料庫產品的主流,這是資料庫歷史上的一個重要轉折點。
  • 極致洞察,華為最新SAP HANA方案引領數據行業
    SAP HANA是一種預製內存資料庫的一體機,可以將數據處理及業務邏輯處理功能組合至內存中,突破傳統交易型資料庫架構中應用程式不支持實時業務應用的限制,實現對業務數據的實時查詢,極大提升OLTP應用體驗。那麼,OLAP應用呢?如果將兩者進行比較,OLTP為操作型處理,基於資料庫,供一線人員操作,執行大多較短,強調內存效率和實時處理。
  • SAP HANA助力德國隊圓夢世界盃|汐帆科技
    該軟體完全運行在SAP HANA內存資料庫平臺之上,它能夠記錄球員的跑動路線和傳球路線。通過對這些數據的深度分析,主教練與助理教練能夠了解到球員的狀態如何,以及怎樣對訓練內容作出調整,提高訓練質量並制定高效的訓練計劃。德國國家隊領隊比埃爾霍夫表示:「主教練勒夫依然會根據自身的經驗以及直覺來做指揮,但有了這些數據,他能夠在比賽進行之中就直觀地了解到問題所在,並在場上及時作出調整。
  • Jerry在2020 SAP全球技術大會的分享:SAP Spartacus技術介紹的文字版
    Spartacus特性之四:開源,免費Spartacus的代碼是完全開源的,託管在Github上。如果大家細心察看Github倉庫上的代碼提交者列表,就會發現,這些代碼貢獻者有的是像Jerry這樣的SAP職員,有的來自partner公司,還有freelancer即自由職業者。
  • 揭開SAP Fiori編程模型規範裡註解的神秘面紗 - @ObjectModel.read...
    這個方法實現體的語義也很清楚,如果後臺模型欄位sap:updatable設置為false,則canUpdateProperty函數調用返回false,導致SmartField.setEditable以參數false去渲染Fiori UI.
  • TechEd回歸、HANA Cloud入華 SAP全球網絡中的「中國基因」
    SAP HANA Cloud是部署在雲端的內存資料庫。所謂內存資料庫,是將數據放在內存中直接操作的資料庫,相對以往的磁碟讀寫速度快出幾個數量級。10年前,SAP發布了SAP HANA,2020年,HANA被搬上了雲。
  • 圖資料庫的介紹是什麼?數易軒:聊一聊圖資料庫選型
    圖資料庫應用適用範圍越來越廣泛,受到了越來越多企業的關注與青睞,相較於傳統的關係資料庫,進一步提高了處理速度與效率,數易軒致力於圖資料庫技術服務,為您介紹我們為什麼需要圖資料庫。定義的圖形資料庫圖形資料庫專門用於存儲和導航關係。關係是圖形資料庫中的一等公民,圖形資料庫的大部分價值都源自於這些關係。圖形資料庫使用節點來存儲數據實體,並使用邊緣來存儲實體之間的關係。邊緣始終有一個開始節點、結束節點、類型和方向,並且邊緣可以描述父子關係、操作、所有權等。一個節點可以擁有的關係的數量和類型沒有限制。
  • 2020託管加盟行業介紹
    託管加盟的含義早期託管大多都是以小飯桌的形式存在,只負責解決學生中午或者晚上的食宿,再加上前期政策對這方面放得比較寬,所以條件大多都比較簡陋,各方麵條件大多都不達標。米德優託管加盟託管加盟的前景二胎放開後的生源倍增,全國小學生數超過1個億,保守剛需50%,約5810萬,市場直接年消費近萬億。
  • 2019 年開源資料庫報告發布:MySQL 仍衛冕
    我們通過開源資料庫與商業資料庫來細分數據:開源資料庫開源資料庫是免費的社區資料庫,其原始碼可供公眾使用,並且可以在其原始設計中進行修改或使用。開源資料庫的流行示例包括MySQL,PostgreSQL和MongoDB。
  • 競價託管多少錢競價託管哪個好?
    如何選擇競價託管的哪些好的內容運營有很多好處,但缺少有風險的內容。 各企業都會告訴我們需要的是內容,如果控制和做內容的方法不對呢? 這會傷害你的知名品牌嗎? 本文強調了當前重要的知名品牌內容運營的重要風險性。 同樣,很多公司對競價託管的幾個月的問題也感興趣。 以前,愛江湖科學技術寫了一篇關於競價託管幾個月的答案的文章。