Пользовательские функции в SQLite
Обычно СУБД предоставляют множество встроенных функций. Но все равно их иногда не хватает, и тогда приходится писать собственные пользовательские функции на «чистом» SQL или производном языке (вроде pl/sql в Оракле или pl/pgsql в Постгресе).
По умолчанию SQLite не поддерживает пользовательские функции. Но вы легко можете включить их с помощью расширения sqlean-define
.
Примечание. В отличие от других СУБД, добавить расширение в SQLite элементарно. Скачиваете файл, выполняете одну команду — и готово.
Пользовательские функции
С sqlean-define
несложно определить собственную функцию:
select define('sumn', ':n * (:n + 1) / 2');
А затем использовать, как будто встроенную:
select sumn(5);
-- 15
Пользовательские функции могут принимать несколько параметров и вызывать другие функции.
Сгенерировать случайное N
, такое что a ≤ N ≤ b
:
select define('randint', ':a + abs(random()) % (:b - :a + 1)');
select randint(10, 99);
-- 42
select randint(10, 99);
-- 17
select randint(10, 99);
-- 29
Показать все пользовательские функции:
select * from sqlean_define;
Удалить функцию:
select undefine('sumn');
Можно даже задать функцию, которая возвращает несколько значений!
Динамический SQL
Если функции не нужны, а хочется динамически составить SQL-запрос и выполнить его — поможет функция eval()
:
select eval('select 10 + 32');
-- 42
Можно выполнять любые DDL и DML запросы:
select eval('create table tmp(value int)');
select eval('insert into tmp(value) values (1), (2), (3)');
select eval('select value from tmp');
select eval('drop table tmp');
Установка
Скачайте свежий релиз
Подключите в командной строке SQLite (
sqlite.exe
):
sqlite> .load ./define
sqlite> select define('sumn', ':n * (:n + 1) / 2');
sqlite> select sumn(5);
Как установить расширение для IDE, Python и других сценариев.
Документация расширения с подробным описанием.
★ Подписывайтесь на новые заметки.