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.