СОЗДАНИЕ ФУНКЦИИ UDF
Синтаксис
CREATE [OR REPLACE] [AGGREGATE] FUNCTION [IF NOT EXISTS] function_name
RETURNS {STRING|INTEGER|REAL|DECIMAL}
SONAME shared_library_name
Описание
Пользовательская функция (UDF) — это способ расширения MariaDB новой функцией, которая работает подобно встроенной функции MariaDB, например, ABS() или CONCAT().
function_name — это имя, которое должно использоваться в операторах SQL для вызова функции.
Для создания функции необходимо иметь право INSERT для базы данных mysql. Это необходимо, потому чтоCREATE FUNCTION добавляет строку в таблицу mysql.func, которая записывает имя функции, тип и имя общей библиотеки. Если у вас нет этой таблицы, вам следует выполнить команду mariadb-upgrade для её создания.
UDF должны быть написаны на C, C++ или другом языке, использующем соглашения вызова C. MariaDB должна быть динамически скомпилирована, а ваша операционная система должна поддерживать динамическую загрузку.
Пример см. sql/udf_example.cc в дереве исходного кода. Коллекцию существующих UDF см. в http://www.mysqludf.org/.
Операторы, использующие пользовательские функции, не являются безопасными для репликации.
Для создания хранимой функции, в отличие от пользовательской функции, см. CREATE FUNCTION.
О действительных идентификаторах для использования в качестве имён функций см. Имена идентификаторов.
Возвращаемое значение
Оператор RETURNS указывает тип возвращаемого значения функции и может быть СТРОКА, ЦЕЛОЕ, ВЕЩЕСТВЕННОЕ или ДЕСЯТИЧНОЕ. DECIMAL функции в настоящее время возвращают строковые значения и должны быть написаны как функции СТРОКА.
Имя общей библиотеки
shared_library_name — это имя базового файла общего объекта, содержащего код, реализующий функцию. Файл должен находиться в каталоге плагинов. Этот каталог задаётся значением системной переменной plugin_dir. Обратите внимание, что до MariaDB/MySQL 5.1 общий объект мог находиться в любом каталоге, который проверялся динамическим загрузчиком вашей системы.
Агрегированные функции
Агрегированные функции — это сводные функции, такие как SUM() и AVG().
Агрегированные UDF-функции могут использоваться как функции окон.
ЗАМЕНИТЬ
Оператор OR REPLACE был добавлен в MariaDB 10.1.3
Если используется необязательный OR REPLACE оператор, он действует как сокращение для:
DROP FUNCTION IF EXISTS function_name; CREATE FUNCTION name ...;
ЕСЛИ НЕ СУЩЕСТВУЕТ
Оператор IF NOT EXISTS был добавлен в MariaDB 10.1.3
При использовании оператора IF NOT EXISTS, MariaDB вернёт предупреждение вместо ошибки, если указанная функция уже существует. Не может быть использован вместе с OR REPLACE.
Обновление UDF
Для обновления общей библиотеки UDF сначала выполните оператор DROP FUNCTION, затем обновите общую библиотеку и, наконец, выполните оператор CREATE FUNCTION. Если вы обновите без выполнения этих шагов, вы можете привести к сбою сервера.
Примеры
CREATE FUNCTION jsoncontains_path RETURNS integer SONAME 'ha_connect.so'; Query OK, 0 rows affected (0.00 sec)
OR REPLACE и IF NOT EXISTS:
CREATE FUNCTION jsoncontains_path RETURNS integer SONAME 'ha_connect.so'; ERROR 1125 (HY000): Function 'jsoncontains_path' already exists CREATE OR REPLACE FUNCTION jsoncontains_path RETURNS integer SONAME 'ha_connect.so'; Query OK, 0 rows affected (0.00 sec) CREATE FUNCTION IF NOT EXISTS jsoncontains_path RETURNS integer SONAME 'ha_connect.so'; Query OK, 0 rows affected, 1 warning (0.00 sec) SHOW WARNINGS; +-------+------+---------------------------------------------+ | Level | Code | Message | +-------+------+---------------------------------------------+ | Note | 1125 | Function 'jsoncontains_path' already exists | +-------+------+---------------------------------------------+
См. также
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/create-function-udf/