前言部分
大家可以關注我的公眾號,公眾號里的排版更好,閱讀更舒適。
正文部分
前面幾篇講了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"); }