创建存储过程

已完成

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 回调函数。 回调函数有两个参数:一个用于错误对象,以防作失败,另一个参数用于返回值,在本例中为创建的对象。 在回调中,可以处理异常或抛出错误。 如果未提供回调并出现错误,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 函数可以实现基于延续的模型来批处理或恢复执行。 延续值可以是所选的任何值,然后应用程序可以使用此值从新的起点恢复事务。 下图描述了事务延续模型如何用于重复服务器端函数,直到函数完成其整个处理工作负荷。

此图描述了事务延续模型如何用于重复服务器端函数,直到函数完成其整个处理工作负荷。