Creación de procedimientos almacenados

Completado

Azure Cosmos DB ofrece una ejecución transaccional integrada del lenguaje de JavaScript que le permite escribir procedimientos almacenados, desencadenadores y funciones definidas por el usuario (UDF) . Para llamar a un procedimiento almacenado, desencadenador o función definida por el usuario, debe registrarlos. Para obtener más información, consulte How to work with stored procedures, triggers, user-defined functions in Azure Cosmos DB (Trabajo con procedimientos almacenados, desencadenadores y funciones definidas por el usuario en Azure Cosmos DB).

Nota:

Esta unidad se centra en los procedimientos almacenados; en la siguiente unidad se tratan los desencadenadores y las funciones definidas por el usuario.

Escritura de procedimientos almacenados

Los procedimientos almacenados pueden crear, actualizar, leer, consultar y eliminar elementos dentro de un contenedor de Azure Cosmos. Los procedimientos almacenados se registran por colección y pueden funcionar en cualquier documento o dato adjunto presente en esa colección.

Este es un sencillo procedimiento almacenado que devuelve una respuesta "Hola mundo".

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

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

El objeto de contexto proporciona acceso a todas las operaciones que se pueden realizar en Azure Cosmos DB, y acceso a los objetos de solicitud y respuesta. En este caso, usará el objeto de respuesta para establecer el cuerpo de la respuesta que se devolverá al cliente.

Creación de un elemento con el procedimiento almacenado

Cuando se crea un elemento utilizando un procedimiento almacenado, el elemento se inserta en el contenedor de Azure Cosmos DB y se devuelve un id. para el elemento recién creado. La creación de un elemento es una operación asincrónica y depende de las funciones de devolución de llamada de JavaScript. La función de devolución de llamada tiene dos parámetros: uno para el objeto de error en caso de que la operación no se complete y otro para un valor devuelto; en este caso, el objeto creado. Dentro de la devolución de llamada, puede controlar la excepción o lanzar un error. En caso de que no se proporcione una devolución de llamada y haya un error, el sistema en tiempo de ejecución de Azure Cosmos DB produce un error.

El procedimiento almacenado también incluye un parámetro para establecer la descripción, que es un valor booleano. Cuando el parámetro se establece en true y falta la descripción, el procedimiento almacenado iniciará una excepción. En caso contrario, el resto del procedimiento almacenado continúa ejecutándose.

Este procedimiento almacenado toma como entrada documentToCreate, el cuerpo de un documento que se va a crear en la colección actual. Todas estas operaciones son asíncronas y dependen de las devoluciones de llamadas de función de 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;
    }
}

Matrices como parámetros de entrada para procedimientos almacenados

Al definir un procedimiento almacenado en Azure Portal, los parámetros de entrada siempre se envían como una cadena al procedimiento almacenado. Incluso si pasa una matriz de cadenas como entrada, la matriz se convierte en cadena y se envía al procedimiento almacenado. Para solucionar este problema, puede definir una función en el procedimiento almacenado para analizar la cadena como una matriz. El código siguiente muestra cómo analizar un parámetro de entrada de cadena como una matriz:

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

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

Ejecución vinculada

Todas las operaciones de Azure Cosmos DB deben completarse en un período de tiempo limitado. Los procedimientos almacenados tienen una cantidad limitada de tiempo para ejecutarse en el servidor. Todas las funciones de recopilación devuelven un valor booleano que representa si esa operación se completa, o no.

Transacciones en procedimientos almacenados

Puede implementar las transacciones en los elementos dentro de un contenedor mediante el uso de un procedimiento almacenado. Las funciones de JavaScript pueden implementar un modelo basado en continuación para procesar por lotes o reanudar la ejecución. El valor de continuación puede ser cualquier valor de su elección y las aplicaciones pueden usar este valor para reanudar una transacción desde un nuevo punto de partida. En el diagrama siguiente se muestra cómo se puede usar el modelo de continuación de transacciones para repetir una función del lado servidor hasta que la función finalice toda la carga de trabajo de procesamiento.

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.