Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Většina databází má procedurální dialekt SQL, který můžete použít k definování vlastních funkcí. SQLite ale běží v procesu s vaší aplikací. Místo toho, abyste se museli učit nový dialekt SQL, stačí použít programovací jazyk vaší aplikace.
Skalární funkce
Skalární funkce vrací jednu skalární hodnotu pro každý řádek v dotazu. Definujte nové skalární funkce a přepište předdefinované funkce pomocí CreateFunction.
Seznam podporovaných parametrů a návratových typů argumentu najdete v části func.
Zadáním argumentu state se tato hodnota předá do každého vyvolání funkce. Tento postup použijte, abyste se vyhnuli uzavření.
Určete isDeterministic , jestli je vaše funkce deterministická, aby funkce SQLite mohla při kompilaci dotazů používat další optimalizace.
Následující příklad ukazuje, jak přidat skalární funkci pro výpočet poloměru válce.
connection.CreateFunction(
"volume",
(double radius, double height)
=> Math.PI * Math.Pow(radius, 2) * height);
var command = connection.CreateCommand();
command.CommandText =
@"
SELECT name,
volume(radius, height) AS volume
FROM cylinder
ORDER BY volume DESC
";
Operátoři
Následující operátory SQLite jsou implementovány odpovídajícími skalárními funkcemi. Definování těchto skalárních funkcí ve vaší aplikaci přepíše chování těchto operátorů.
| Operátor | Funkce |
|---|---|
| X GLOB Y | glob(Y, X) |
| X jako Y | like(Y, X) |
| X LIKE Y ESCAPE Z | like(Y, X, Z) |
| X POROVNÁNÍ Y | match(Y, X) |
| X REGEXP Y | regexp(Y, X) |
Následující příklad ukazuje, jak definovat regexp funkce povolit jeho odpovídající operátor. SQLite neobsahuje výchozí implementaci funkce regexp.
connection.CreateFunction(
"regexp",
(string pattern, string input)
=> Regex.IsMatch(input, pattern));
var command = connection.CreateCommand();
command.CommandText =
@"
SELECT count()
FROM user
WHERE bio REGEXP '\w\. {2,}\w'
";
var count = command.ExecuteScalar();
Agregační funkce
Agregační funkce vrací jednu agregovanou hodnotu pro všechny řádky v dotazu. Definujte a přepište agregační funkce pomocí CreateAggregate.
Argument seed určuje počáteční stav kontextu. Použijte ho, abyste se vyhnuli také uzavření.
Argument func se vyvolá jednou za řádek. Pomocí kontextu můžete nashromáždět konečný výsledek. Vrať kontext. Tento vzor umožňuje kontextu být hodnotovým typem nebo neměnným.
Pokud není zadán žádný resultSelector , použije se konečný stav kontextu jako výsledek. To může zjednodušit definici funkcí, jako je součet a počet, které potřebují pouze zvýšit počet jednotlivých řádků a vrátit je.
Zadejte resultSelector , aby se po iteraci přes všechny řádky vypočítal konečný výsledek z kontextu.
Viz Datové typy pro seznam podporovaných typů parametrů pro argument func a návratové typy pro resultSelector.
Pokud je vaše funkce deterministická, zadejte isDeterministic , aby funkce SQLite mohla při kompilaci dotazů používat další optimalizace.
Následující příklad definuje agregační funkci pro výpočet směrodatné odchylky sloupce.
connection.CreateAggregate(
"stdev",
// A tuple to maintain context between rows
(Count: 0, Sum: 0.0, SumOfSquares: 0.0),
// This is called for each row
((int Count, double Sum, double SumOfSquares) context, double value) =>
{
context.Count++;
context.Sum += value;
context.SumOfSquares += value * value;
return context;
},
// This is called to get the final result
context =>
{
var variance = context.SumOfSquares - context.Sum * context.Sum / context.Count;
return Math.Sqrt(variance / context.Count);
});
var command = connection.CreateCommand();
command.CommandText =
@"
SELECT stdev(gpa)
FROM student
";
var stdDev = command.ExecuteScalar();
Chyby
Pokud uživatelem definovaná funkce vyvolá výjimku, vrátí se zpráva do SQLite. SQLite pak vyvolá chybu a Microsoft.Data.Sqlite vyvolá výjimku SqliteException. Další informace najdete v tématu Chyby databáze.
Ve výchozím nastavení bude kód chyby SQLite SQLITE_ERROR (nebo 1). Můžete ho ale změnit tak, že ve své funkci použijete SqliteException s nastavením SqliteErrorCode.
Odstraňování chyb
SQLite volá vaši implementaci přímo. To vám umožní přidat zarážky, které se aktivují, zatímco SQLite vyhodnocuje dotazy. K dispozici je úplné prostředí ladění .NET, které vám pomůže vytvořit uživatelem definované funkce.