【HANA系列】【第六篇】SAP HANA XS使用JavaScript(JS)調用存儲過程(Procedures)


公眾號: matinal
本文作者: matinal
 

 

前言部分

大家可以關注我的公眾號,公眾號里的排版更好,閱讀更舒適。

正文部分

前面幾篇講了SAP HANA XS JavaScript(JS)的基礎內容和相應API,這篇講一下JavaScript如何與后台交互,此篇講存儲過程(Procedures)。

從SAP HANA XS服務器端JavaScript(XSJS)調用存儲過程,並使用JavaScript處理調用的結果。

XS程序提供了一種從XS服務器端JavaScript(XSJS)調用SAP HANA中的存儲過程的方便方法,並使用JavaScript處理調用的結果。 XS程序庫擴展了SAP HANA XS JavaScript數據庫API中已有的功能。使用SAP HANA XS程序調用存儲過程可以認為是開發XS JavaScript服務的任何簡單XS JavaScript函數。

例如,在SAP HANA存儲過程使用一個表作為輸入參數和一個表作為輸出參數,使用XS Procedures可以傳遞給該存儲過程的JavaScript對象(或一組對象)。類似,存儲過程調用的結果作為JavaScript對象的數組提供。將存儲過程聲明為XS JavaScript函數,然后調用存儲過程,就像它是傳遞JavaScript對象的JavaScript函數一樣。

要使用存儲過程作為XS JavaScript函數,需要執行以下步驟:

使用引用現有表的參數調用過程,如果要將表作為參數傳遞而不是JavaScript對象,則必須在調用語句中指定表的名稱(作為字符串)以及schema的名稱。 以下示例顯示如何引用表rating_table:

​
getRating('schema.rating_table', 3);

​

SAP HANA數據庫能夠實現存儲過程調用的結果,也就是說,使用WITH OVERVIEW表達式將結果寫入物理表。在WITH OVERVIEW表達式中,將字符串值傳遞給包含要實現的結果的輸出參數位置。 返回的值不是本身,而是對已寫入結果的表的引用。現在可以從指定的表中檢索過程調用的結果,在本例中為OUTPUT_TABLE

​
var resCall = getRating(rating, 3, "schema.output_table"); 

WITH OVERVIEW表達式還允許將過程的結果寫入全局臨時表中, 也就是說,在會話關閉時被截斷的表。要使用XS過程將過程的結果寫入全局臨時表中,則不指定結果表的名稱,將包含一個空字符串(''),如以下示例所示:

​
var conn = $.db.getConnection();
resCall = getRating(rating, 3, '', conn); 

​

返回的引用指向全局臨時表,可以使用相同的連接查詢存儲過程結果。為了確保訪問全局臨時表,有必要指定連接對象conn。

使用參數存儲為表中的值來調用存儲過程,如以下示例所示。使用與要傳遞的表的行對應的JavaScript數組來傳遞表值輸入參數。這些行對象必須包含與列的名稱對應的屬性。 跳過的列填充為NULL,並且不符合相同命名列的屬性將被忽略。

​
var XSProc = $.import("sap.hana.xs.libs.dbutils", "procedures");
XSProc.setTempSchema($.session.getUsername().toUpperCase());
var conn = $.db.getConnection();
var createPurchaseOrder = XSProc.procedure("SAP_HANA_DEMO",
 "sap.hana.democontent.epm.Procedures::poCreate", {
 connection: conn
 });
var result = createPurchaseOrder([{
 "PURCHASEORDERID": '0300009001',
 "HISTORY.CREATEDBY": '0000000044',
 "HISTORY.CREATEDAT": new Date(),
 "HISTORY.CHANGEDBY": '0000000044',
 "HISTORY.CHANGEDAT": new Date()
}]);
if (result && result.ERROR.length > 0) {
 $.response.setBody(result.ERROR.length + " errors occurred.");
} else {
 $.response.setBody("no error occurred");
}

​

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM