Uživatelem definované funkce
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 func
najdete v části Datové typy.
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átory
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 | Function |
---|---|
X GLOB Y | glob(Y, X) |
X LIKE Y | like(Y, X) |
X LIKE Y ESCAPE Z | like(Y, X, Z) |
X MATCH 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. Definování a přepsání agregačních funkcí 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. Vrátí kontext. Tento vzor umožňuje kontextu být typ hodnoty nebo neměnný.
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.
Seznam podporovanýchtypůch func
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 vyvoláte požadovanou SqliteErrorCode zadanou SqliteException funkci.
Ladění
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.