创建存储过程
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 函数可以实现基于延续的模型来批处理或恢复执行。 延续值可以是所选的任何值,然后应用程序可以使用此值从新的起点恢复事务。 下图描述了事务延续模型如何用于重复服务器端函数,直到函数完成其整个处理工作负荷。