Criar procedimentos armazenados

Concluído

O Azure Cosmos DB fornece execução transacional integrada à linguagem de JavaScript que permite escrever procedimentos armazenados, gatilhos e funções definidas pelo usuário (UDFs). Para chamar um procedimento armazenado, gatilho ou função definida pelo usuário, você precisa registrá-lo. Para obter mais informações, consulte Como trabalhar com procedimentos armazenados, gatilhos, funções definidas pelo usuário no Azure Cosmos DB.

Nota

Esta unidade concentra-se em procedimentos armazenados, a unidade a seguir abrange gatilhos e 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 operar em qualquer documento ou anexo presente nessa coleção.

Aqui está um procedimento armazenado simples que retorna uma resposta "Hello World".

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 executadas no Azure Cosmos DB e acesso aos objetos de solicitação e resposta. Nesse caso, você usa o objeto response para definir o corpo da resposta a ser enviado de volta ao cliente.

Criar um item usando o procedimento armazenado

Quando você cria um item usando um procedimento armazenado, o item é inserido no contêiner do Azure Cosmos DB e uma ID para o item recém-criado é retornada. Criar um item é uma operação assíncrona e depende das funções de retorno de chamada JavaScript. A função de retorno de chamada tem dois parâmetros: um para o objeto de erro no caso de a operação falhar e outro para um valor de retorno, neste caso, o objeto criado. Dentro do retorno de chamada, você pode manipular a exceção ou lançar um erro. Se um retorno de chamada não for fornecido e houver um erro, o tempo de execução do Azure Cosmos DB lançará um erro.

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

Este 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 da função 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 para o 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, você pode definir uma função dentro do 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 devem ser concluídas dentro de um período de tempo limitado. Os procedimentos armazenados têm um tempo limitado para serem executados no servidor. Todas as funções de coleta retornam um valor booleano que representa se essa operação é concluída ou não

Transações dentro de procedimentos armazenados

Você pode 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 lotear ou retomar a execução. O valor de continuação pode ser qualquer valor de sua escolha e seus aplicativos podem usar esse valor para retomar uma transação a partir de um novo ponto de partida. O diagrama a seguir mostra como o modelo de continuação de transação pode ser usado para repetir uma função do lado do servidor até que a função termine toda a sua 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.