Felhasználó által definiált függvények
A legtöbb adatbázis rendelkezik az SQL eljárási dialektusával, amellyel saját függvényeket határozhat meg. Az SQLite azonban folyamatban fut az alkalmazással. Az SQL új dialektusának elsajátítása helyett egyszerűen használhatja az alkalmazás programozási nyelvét.
Skaláris függvények
A skaláris függvények egyetlen skaláris értéket adnak vissza a lekérdezés minden sorához. Új skaláris függvények definiálása és a beépített függvények felülbírálása a használatával CreateFunction.
A támogatott paraméterek listáját és az argumentum visszatérési típusait az func
Adattípusok című témakörben találja.
Az argumentum megadásával ezt az state
értéket a függvény minden meghívása megkapja. Ezzel elkerülheti a lezárásokat.
Adja meg isDeterministic
, hogy a függvény determinisztikus-e ahhoz, hogy az SQLite további optimalizálásokat használjon a lekérdezések összeállításakor.
Az alábbi példa bemutatja, hogyan adhat hozzá skaláris függvényt a henger sugarának kiszámításához.
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átorok
A következő SQLite operátorokat a megfelelő skaláris függvények implementálják. Ezeknek a skaláris függvényeknek az alkalmazásban való definiálása felülírja ezeknek az operátoroknak a viselkedését.
Operátor | Függvény |
---|---|
X GLOB Y | glob(Y, X) |
X LIKE Y | like(Y, X) |
X LIKE Y ESCAPE Z | like(Y, X, Z) |
X EGYEZÉS Y | egyezés(Y, X) |
X REGEXP Y | regexp(Y, X) |
Az alábbi példa bemutatja, hogyan definiálhatja a regexp függvényt a megfelelő operátor engedélyezéséhez. Az SQLite nem tartalmazza a regexp függvény alapértelmezett implementációját.
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();
Aggregátumfüggvények
Az összesítő függvények egyetlen összesített értéket adnak vissza a lekérdezés összes sorához. Összesítő függvények definiálása és felülbírálása a következő használatával CreateAggregate: .
Az seed
argumentum a környezet kezdeti állapotát adja meg. Ezzel elkerülheti a lezárásokat is.
Az func
argumentum meghívása soronként egyszer történik. A környezet használatával halmozhat fel végeredményt. Adja vissza a környezetet. Ez a minta lehetővé teszi, hogy a környezet értéktípus vagy nem módosítható legyen.
Ha nincs resultSelector
megadva, a rendszer a környezet végső állapotát használja az eredményként. Ez leegyszerűsítheti az olyan függvények definícióját, mint az összeg és a darabszám, amelyeknek csak egy számot kell növelniük minden sorban, és vissza kell adniuk.
Adja meg resultSelector
, hogy az összes sor iterálása után számítsa ki a végeredményt a környezetből.
Az argumentum támogatott paramétertípusainak listáját az Adattípusok és a func
visszatérési típusok resultSelector
című témakörben találja.
Ha a függvény determinisztikus, adja meg isDeterministic
, hogy az SQLite további optimalizálásokat használhasson a lekérdezések összeállításakor.
Az alábbi példa egy aggregátumfüggvényt határoz meg egy oszlop szórásának kiszámításához.
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();
Errors
Ha egy felhasználó által definiált függvény kivételt jelez, a rendszer visszaadja az üzenetet az SQLite-nek. Az SQLite ezután hibát jelez, a Microsoft.Data.Sqlite pedig egy SqliteException hibát fog eredményezni. További információ: Adatbázishibák.
Alapértelmezés szerint az SQLite hibakód SQLITE_ERROR (vagy 1). Ezt azonban módosíthatja úgy, hogy a SqliteException kívánt értéket SqliteErrorCode adja meg a függvényben.
Hibakeresés
Az SQLite közvetlenül meghívja a megvalósítást. Ez lehetővé teszi olyan töréspontok hozzáadását, amelyek az SQLite lekérdezések kiértékelése során aktiválnak. A teljes .NET hibakeresési felület elérhető a felhasználó által definiált függvények létrehozásához.