建立預存程序

已完成

Azure Cosmos DB 所提供的語言整合式、交易式 JavaScript 執行,可讓您撰寫預存程序觸發程序使用者定義函式 (UDF)。 若要呼叫預存程序、觸發程序或使用者定義函數,您必須加以註冊。 如需詳細資訊,請參閱如何在 Azure Cosmos DB 中使用預存程序、觸發程序、使用者定義函式

注意

本單元著重於預存程序,下列單元涵蓋觸發程序和使用者定義函數。

寫入預存程序

預存程序可建立、更新、讀取、查詢和刪除 Azure Cosmos 容器內的項目。 預存程序會按照集合進行註冊,而且可執行於該集合中現有的文件或附件。

以下提供會傳回 "Hello World" 回應的簡單預存程序。

var helloWorldStoredProc = {
    id: "helloWorld",
    serverScript: function () {
        var context = getContext();
        var response = context.getResponse();

        response.setBody("Hello, World");
    }
}

內容物件可讓您存取能在 Azure Cosmos DB 中執行的所有作業,以及存取要求和回應物件。 在此案例中,您會使用回應物件來設定要傳回給用戶端的回應本文。

使用預存程序建立項目

當您使用預存程序建立項目時,該項目會插入 Azure Cosmos DB 容器中,並傳回新建項目的識別碼。 建立項目是非同步作業,並依存於 JavaScript 回呼函式。 回呼函式有兩個參數,一個是用於因應作業失敗的錯誤物件,另一個用於傳回值 (在此案例中,為已建立的物件)。 在回呼內,您可以處理例外狀況或擲回錯誤。 如果系統未提供回呼,而且發生錯誤,Azure Cosmos DB 執行階段會擲回錯誤。

預存程序也包含用來將說明設定為布林值的參數。 當此參數設定為 true 時,若沒有描述,則預存程序會擲回例外狀況。 否則,預存程序的其餘部分會繼續執行。

此預存程序以 documentToCreate (要在目前集合中建立的文件本文) 作為輸入。 所有這類作業都是非同步的,而且需仰賴 JavaScript 函數回呼。

var createDocumentStoredProc = {
    id: "createMyDocument",
    body: function createMyDocument(documentToCreate) {
        var context = getContext();
        var collection = context.getCollection();
        var accepted = collection.createDocument(collection.getSelfLink(),
              documentToCreate,
              function (err, documentCreated) {
                  if (err) throw new Error('Error' + err.message);
                  context.getResponse().setBody(documentCreated.id)
              });
        if (!accepted) return;
    }
}

以陣列作為預存程序的輸入參數

使用 Azure 入口網站定義預存程序時,輸入參數一律會以字串形式傳送到預存程序。 即使您以輸入形式傳遞字串陣列,陣列會轉換成字串並傳送至預存程序。 若要解決此問題,您可以在預存程序內定義一個函式,將字串剖析為陣列。 下列程式碼說明如何將字串輸入參數剖析為陣列:

function sample(arr) {
    if (typeof arr === "string") arr = JSON.parse(arr);

    arr.forEach(function(a) {
        // do something here
        console.log(a);
    });
}

界限執行

所有 Azure Cosmos DB 作業都必須在有限的時間內完成。 預存程序在伺服器上的執行時間有限。 所有集合函數都會傳回布林值,代表該作業是否會完成

預存程序內的交易

您可以使用預存程序,對容器內的項目實作交易。 JavaScript 函數可以實作以接續為基礎的模型,以批次或繼續執行。 接續值可以是您選擇的任何值,而您的應用程式接著可以使用此值從新的起點繼續交易。 下圖說明交易接續模型如何用來重複伺服器端函式,直到函式完成整個處理工作負載為止。

This diagram depicts how the transaction continuation model can be used to repeat a server-side function until the function finishes its entire processing workload.