Creare le stored procedure

Completato

L'esecuzione integrata e transazionale di JavaScript con il linguaggio di Azure Cosmos DB permette di scrivere stored procedure, trigger e funzioni definite dall'utente. Per chiamare una stored procedure, un trigger o una funzione definita dall'utente, è necessario eseguirne la registrazione. Per altre informazioni, vedere Come usare stored procedure, trigger e funzioni definite dall'utente in Azure Cosmos DB.

Nota

Questa unità si concentra sulle stored procedure, l'unità seguente copre i trigger e le funzioni definite dall'utente.

Scrittura di stored procedure

Le stored procedure possono creare, aggiornare, leggere, eseguire query ed eliminare elementi all'interno di un contenitore di Azure Cosmos. Le stored procedure vengono registrate per ogni raccolta e funzionano in qualsiasi documento o allegato presente nella raccolta.

Ecco una semplice stored procedure che restituisce una risposta "Hello World".

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

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

L'oggetto contesto offre accesso a tutte le operazioni che è possibile eseguire in Azure Cosmos DB e accesso agli oggetti richiesta e risposta. In questo caso, si usa l'oggetto risposta per impostare il corpo della risposta da restituire al client.

Creare un elemento usando una stored procedure

Gli elementi creati con una stored procedure vengono inseriti nel contenitore di Azure Cosmos DB e viene restituito un ID per ognuno di quelli appena creati. La creazione di un elemento è un'operazione asincrona e dipende dalle funzioni di callback JavaScript. La funzione di callback dispone di due parametri: uno per l'oggetto errore, nel caso in cui l'operazione abbia esito negativo, e un altro per un valore restituito, in questo caso l'oggetto creato. All'interno del callback, è possibile gestire l'eccezione oppure generare un errore. Se non viene fornito un callback e si verifica un errore, il runtime di Azure Cosmos DB genera un errore.

La stored procedure include anche un parametro per impostare la descrizione come valore booleano. Quando il parametro è impostato su true e la descrizione non è presente, la stored procedure genera un'eccezione. In caso contrario, il resto della stored procedure rimane in esecuzione.

Questa stored procedure accetta come input documentToCreate, il corpo di un documento da creare nella raccolta corrente. Tutte queste operazioni sono asincrone e dipendono dai callback della funzione 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;
    }
}

Matrice come parametri di input per la stored procedure

Quando si definisce una stored procedure nel portale di Azure, i parametri di input vengono sempre inviati come stringa alla stored procedure. Anche se si passa una matrice di stringhe come input, la matrice viene convertita in stringa e inviata alla stored procedure. Per aggirare questo problema, è possibile definire una funzione all'interno della stored procedure che analizzi la stringa come matrice. Il codice seguente illustra come analizzare un parametro di input di stringa sotto forma di matrice:

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

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

Esecuzione vincolata

Tutte le operazioni di Azure Cosmos DB devono essere completate entro un periodo di tempo limitato. Le stored procedure hanno un periodo di tempo limitato per l'esecuzione nel server. Tutte le funzioni di raccolta restituiscono un valore booleano che indica se l'operazione verrà completata o meno

Transazioni all'interno di stored procedure

È possibile implementare le transazioni negli elementi all'interno di un contenitore usando una stored procedure. Le funzioni JavaScript possono implementare un modello basato su continuazione per l'esecuzione in batch o la ripresa dell'esecuzione. Il valore di continuazione può essere qualsiasi valore scelto e le applicazioni possono quindi usare questo valore per riprendere una transazione da un nuovo punto di partenza. Il diagramma seguente illustra come usare il modello di continuazione delle transazioni per ripetere una funzione sul lato server fino a quando non termina l'intero carico di lavoro di elaborazione.

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.