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

Завершено

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 могут реализовать модель на основе продолжения для пакетного выполнения или возобновления выполнения. Значение продолжения может быть любым значением вашего выбора, и ваши приложения могут использовать это значение для возобновления транзакции с новой начальной точки. На следующей схеме показано, как модель продолжения транзакций может использоваться для повторения серверной функции, пока функция не завершит всю рабочую нагрузку обработки.

На этой схеме показано, как модель продолжения транзакций может использоваться для повторения серверной функции, пока функция не завершит всю рабочую нагрузку обработки.