Vytvoření uložených procedur
Azure Cosmos DB poskytuje jazykově integrované transakční spouštění JavaScriptu, které umožňuje psát uložené procedury, triggery a uživatelem definované funkce (UDF). Pokud chcete volat uloženou proceduru, trigger nebo uživatelem definovanou funkci, musíte ji zaregistrovat. Další informace najdete v tématu Práce s uloženými procedurami, triggery, uživatelem definovanými funkcemi ve službě Azure Cosmos DB.
Poznámka:
Tato lekce se zaměřuje na uložené procedury. Následující lekce se zabývá triggery a uživatelem definovanými funkcemi.
Zápis uložených procedur
Uložené procedury můžou vytvářet, aktualizovat, číst, dotazovat a odstraňovat položky uvnitř kontejneru Azure Cosmos. Uložené procedury jsou registrovány na kolekci a mohou pracovat s libovolným dokumentem nebo přílohou, která je v této kolekci.
Tady je jednoduchá uložená procedura, která vrací odpověď "Hello World".
var helloWorldStoredProc = {
id: "helloWorld",
serverScript: function () {
var context = getContext();
var response = context.getResponse();
response.setBody("Hello, World");
}
}
Kontextový objekt poskytuje přístup ke všem operacím, které je možné provádět ve službě Azure Cosmos DB, a přístup k objektům požadavků a odpovědí. V tomto případě použijete objekt odpovědi k nastavení textu odpovědi, která se má odeslat zpět klientovi.
Vytvoření položky pomocí uložené procedury
Když vytvoříte položku pomocí uložené procedury, položka se vloží do kontejneru Azure Cosmos DB a vrátí se ID nově vytvořené položky. Vytvoření položky je asynchronní operace a závisí na funkcích zpětného volání JavaScriptu. Funkce zpětného volání má dva parametry: jeden pro objekt chyby v případě selhání operace a druhý pro návratovou hodnotu, v tomto případě vytvořený objekt. Uvnitř zpětného volání můžete zpracovat výjimku nebo vyvolat chybu. Pokud zpětné volání není k dispozici a dojde k chybě, modul runtime Služby Azure Cosmos DB vyvolá chybu.
Uložená procedura obsahuje také parametr, který nastaví popis jako logickou hodnotu. Pokud je parametr nastaven na hodnotu true a popis chybí, uložená procedura vyvolá výjimku. V opačném případě se zbývající uložená procedura bude dál spouštět.
Tato uložená procedura přebírá jako vstup documentToCreate
text dokumentu, který se má vytvořit v aktuální kolekci. Všechny tyto operace jsou asynchronní a závisí na zpětných voláních funkcí JavaScriptu.
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;
}
}
Pole jako vstupní parametry pro uložené procedury
Při definování uložené procedury na webu Azure Portal se vstupní parametry vždy odesílají jako řetězec do uložené procedury. I když jako vstup předáte pole řetězců, pole se převede na řetězec a odešle se do uložené procedury. Pokud chcete tento problém obejít, můžete definovat funkci v rámci uložené procedury pro parsování řetězce jako pole. Následující kód ukazuje, jak analyzovat vstupní parametr řetězce jako pole:
function sample(arr) {
if (typeof arr === "string") arr = JSON.parse(arr);
arr.forEach(function(a) {
// do something here
console.log(a);
});
}
Omezené spouštění
Všechny operace Azure Cosmos DB se musí dokončit v omezeném časovém intervalu. Uložené procedury mají omezenou dobu spuštění na serveru. Všechny funkce kolekce vrací logickou hodnotu, která představuje, jestli se tato operace dokončila, nebo ne.
Transakce v rámci uložených procedur
Transakce u položek v kontejneru můžete implementovat pomocí uložené procedury. JavaScriptové funkce můžou implementovat model založený na pokračování pro dávkové nebo obnovení provádění. Hodnota pokračování může být libovolná hodnota podle vašeho výběru a aplikace pak mohou tuto hodnotu použít k obnovení transakce z nového výchozího bodu. Následující diagram znázorňuje, jak lze model pokračování transakce použít k opakování funkce na straně serveru, dokud funkce nedokončí celou úlohu zpracování.