ストアド プロシージャを作成する

完了

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 コンテナーに挿入され、新しく作成された項目の ID が返されます。 項目の作成は非同期操作であり、JavaScript コールバック関数に依存します。 コールバック関数には、操作が失敗した場合のエラー オブジェクト用と、戻り値用のパラメーター (この場合は作成されたオブジェクト) の 2 つのパラメーターがあります。 コールバック内では、例外を処理するか、エラーをスローできます。 コールバックが指定されておらず、エラーが発生した場合には、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 portal でストアド プロシージャを定義する場合、入力パラメーターは常に文字列としてストアド プロシージャに送信されます。 文字列の配列を入力として渡しても、配列は文字列に変換され、ストアド プロシージャに送信されます。 これを回避するには、ストアド プロシージャ内で関数を定義して、文字列を配列として解析します。 次のコードは、文字列入力パラメーターを配列として解析する方法を示しています。

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 関数は、継続ベースのモデルを実装して、実行をバッチ処理または再開できます。 継続値は任意の値にすることができ、アプリケーションはこの値を使用して新しい開始点からトランザクションを再開できます。 次の図は、トランザクション継続モデルを使用して、関数が処理ワークロード全体を完了するまでサーバー側関数を繰り返す方法を示しています。

この図は、トランザクション継続モデルを使用して、関数が処理ワークロード全体を終了するまでサーバー側関数を繰り返す方法を示しています。