Sdílet prostřednictvím


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.

Viz také