Bagikan melalui


Fungsi yang ditentukan pengguna

Sebagian besar database memiliki dialek prosedural SQL yang dapat Anda gunakan untuk menentukan fungsi Anda sendiri. Namun, SQLite berjalan dalam proses dengan aplikasi Anda. Kiranya harus mempelajari dialek baru SQL, Anda hanya dapat menggunakan bahasa pemrograman aplikasi Anda.

Fungsi bernilai skalar

Fungsi skalar mengembalikan satu nilai skalar untuk setiap baris dalam kueri. Tentukan fungsi skalar baru dan ambil alih fungsi bawaan menggunakan CreateFunction.

Lihat Jenis data untuk daftar parameter yang didukung dan jenis pengembalian untuk func argumen.

Menentukan state argumen akan meneruskan nilai tersebut ke dalam setiap pemanggilan fungsi. Menggunakan ini untuk menghindari penutupan.

Tentukan isDeterministic apakah fungsi Anda deterministik untuk memungkinkan SQLite menggunakan pengoptimalan tambahan saat mengkompilasi kueri.

Contoh berikut menunjukkan cara menambahkan fungsi skalar untuk menghitung radius silinder.

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
";

Operator

Operator SQLite berikut diimplementasikan oleh fungsi skalar yang sesuai. Menentukan fungsi skalar ini di aplikasi Anda akan mengambil alih perilaku operator ini.

Operator 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)

Contoh berikut menunjukkan cara menentukan fungsi regexp untuk mengaktifkan operator yang sesuai. SQLite tidak menyertakan implementasi default fungsi 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();

Fungsi agregat

Fungsi agregat mengembalikan satu nilai agregat untuk semua baris dalam kueri. Tentukan dan ganti fungsi agregat menggunakan CreateAggregate.

Argumen seed menentukan status awal konteks. Menggunakan ini untuk menghindari penutupan.

Argumen func dipanggil sekali per baris. Menggunakan konteks untuk mengakumulasi hasil akhir. Mengembalikan konteksnya. Pola ini memungkinkan konteks menjadi jenis nilai atau tidak dapat diubah.

Jika tidak resultSelector ada yang ditentukan, status akhir konteks digunakan sebagai hasilnya. Ini dapat menyederhanakan definisi fungsi seperti jumlah dan hitungan yang hanya perlu menaikkan angka setiap baris dan mengembalikannya.

Tentukan resultSelector untuk menghitung hasil akhir dari konteks setelah melakukan iterasi melalui semua baris.

Lihat Jenis data untuk daftar jenis parameter yang didukung untuk func argumen dan jenis pengembalian untuk resultSelector.

Tentukan isDeterministic apakah fungsi Anda deterministik untuk memungkinkan SQLite menggunakan pengoptimalan tambahan saat mengkompilasi kueri.

Contoh berikut mendefinisikan fungsi agregat untuk menghitung simpantan baku kolom.

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();

Kesalahan

Jika fungsi yang ditentukan pengguna melempar pengecualian, pesan dikembalikan ke SQLite. SQLite kemudian akan memunculkan kesalahan dan Microsoft.Data.Sqlite akan melemparkan SqliteException. Untuk informasi selengkapnya, lihat Kesalahan database.

Secara default, kode kesalahan SQLite kesalahan akan SQLITE_ERROR (atau 1). Namun, Anda dapat mengubahnya dengan melemparkan SqliteException dalam fungsi Anda dengan yang diinginkan SqliteErrorCode.

Awakutu

SQLite memanggil implementasi Anda secara langsung. Ini memungkinkan Anda menambahkan titik henti yang memicu saat SQLite mengevaluasi kueri. Pengalaman penelusuran kesalahan .NET lengkap tersedia untuk membantu Anda membuat fungsi yang ditentukan pengguna.

Lihat juga