创建存储过程

已完成

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 函数可以实现基于持续的模型以批处理或恢复执行。 持续值可以是你选择的任何值,应用程序随后可以使用此值从新的起始点恢复事务。 下图描述了在函数完成其整个处理工作负载之前,如何使用事务持续模型重复服务器端函数。

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.