Создание хранимых процедур

Завершено

Azure Cosmos DB обеспечивает встроенное в язык транзакционное выполнение JavaScript, которое позволяет писать хранимые процедуры, триггеры и определяемые пользователем функции. Чтобы вызвать хранимую процедуру, триггер или определяемую пользователем функцию, необходимо их зарегистрировать. Дополнительные сведения см. в статье о том, как зарегистрировать и использовать хранимые процедуры, триггеры и определяемые пользователем функции в 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.