Criar procedimentos armazenados

Concluído

O Azure Cosmos DB oferece execução transacional e integrada de linguagem do JavaScript que permite escrever procedimentos armazenados, gatilhos e UDFs (funções definidas pelo usuário). Para chamar um procedimento armazenado, um gatilho ou uma função definida pelo usuário, você precisa registrar esse item. Para saber mais, confira Como trabalhar com procedimentos armazenados, gatilhos e funções definidas pelo usuário no Azure Cosmos DB.

Observação

Esta unidade se concentra em procedimentos armazenados, a unidade a seguir aborda os gatilhos e as funções definidas pelo usuário.

Escrevendo procedimentos armazenados

Os procedimentos armazenados podem criar, atualizar, ler, consultar e excluir itens dentro de um contêiner do Azure Cosmos. Os procedimentos armazenados são registrados por coleção e podem ser operados em qualquer documento ou ser um anexo presente na coleção.

Veja aqui um procedimento armazenado simples que retorna uma resposta "Olá, Mundo".

var helloWorldStoredProc = {
    id: "helloWorld",
    serverScript: function () {
        var context = getContext();
        var response = context.getResponse();

        response.setBody("Hello, World");
    }
}

O objeto de contexto fornece acesso a todas as operações que podem ser realizadas no Azure Cosmos DB, bem como o acesso aos objetos de solicitação e de resposta. Nesse caso, use o objeto de resposta para definir o corpo da resposta a ser enviada de volta para o cliente.

Criar um item usando o procedimento armazenado

Quando você cria um item usando um procedimento armazenado, ele é inserido no contêiner do Azure Cosmos DB e uma ID é retornada para ele. A criação de um item é uma operação assíncrona e depende das funções de retorno de chamada do JavaScript. A função de retorno de chamada tem dois parâmetros: um para o objeto de erro, caso a operação falhe, e outro para um valor de retorno, nesse caso, o objeto criado. Dentro da chamada de retorno, é possível lidar com a exceção ou gerar um erro. Se um retorno de chamada não for fornecido e ocorrer uma falha, o runtime do Azure Cosmos DB gerará um erro.

O procedimento armazenado também inclui um parâmetro para definir a descrição como um valor booliano. Quando o parâmetro é definido como true e a descrição está ausente, o procedimento armazenado gera uma exceção. Caso contrário, o restante do procedimento armazenado continuará em execução.

Esse procedimento armazenado toma como entrada documentToCreate, o corpo de um documento a ser criado na coleção atual. Todas essas operações são assíncronas e dependem de retornos de chamada de função do 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;
    }
}

Matrizes como parâmetros de entrada para procedimentos armazenados

Ao definir um procedimento armazenado no portal do Azure, os parâmetros de entrada são sempre enviados como uma cadeia de caracteres ao procedimento armazenado. Mesmo se você passar uma matriz de cadeias de caracteres como uma entrada, a matriz será convertida em cadeia de caracteres e enviada para o procedimento armazenado. Para contornar isso, é possível definir uma função no procedimento armazenado para analisar a cadeia de caracteres como uma matriz. O código a seguir mostra como analisar um parâmetro de entrada de cadeia de caracteres como uma matriz:

function sample(arr) {
    if (typeof arr === "string") arr = JSON.parse(arr);

    arr.forEach(function(a) {
        // do something here
        console.log(a);
    });
}

Execução vinculada

Todas as operações do Azure Cosmos DB precisam ser concluídas durante um período limitado. Os procedimentos armazenados têm uma quantidade limitada de tempo para serem executados no servidor. Todas as funções de coleção retornam um valor booliano que representa se a operação é concluída ou não

Transações em procedimentos armazenados

É possível implementar transações em itens dentro de um contêiner usando um procedimento armazenado. As funções JavaScript podem implementar um modelo baseado em continuação para realizar a execução em lote ou retomá-la. O valor de continuação pode ser qualquer valor da sua escolha e os aplicativos podem usar esse valor para retomar uma transação de um novo ponto de partida. O diagrama a seguir descreve como o modelo de continuação de transação pode ser usado para repetir uma função do servidor até que ela conclua toda a carga de trabalho de processamento.

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.