用户自定义函数(UDF)
概述
平凯数据库支持以下两类用户自定义函数:
- 不带
SONAME的CREATE FUNCTION,即通过 SQL 定义函数体。这类函数与存储过程共用执行框架。 - 基于
SONAME的 Loadable UDF,即从共享库中加载函数。
两类函数创建后都可以通过普通 SQL 表达式调用。
功能开关
不带 SONAME 的用户自定义函数由全局系统变量 tidb_enable_procedure 控制。
当该变量为 ON 时,可以创建、调用、查看、修改和删除函数;
当该变量为 OFF 时,创建函数和调用已有函数都会报错。
SET GLOBAL tidb_enable_procedure = ON;
SHOW VARIABLES LIKE 'tidb_enable_procedure';创建用户自定义函数
单语句函数可以直接使用 RETURN 定义:
CREATE FUNCTION hello(s CHAR(20)) RETURNS CHAR(50)
RETURN CONCAT('hello, ', s, '!');如果函数体包含多条语句,可以使用 BEGIN ... END,
并在 MySQL 客户端中配合自定义分隔符:
DELIMITER //
CREATE FUNCTION add_one(x INT) RETURNS INT
SQL SECURITY INVOKER
COMMENT 'increment input'
BEGIN
RETURN x + 1;
END//
DELIMITER ;当前常用的函数特征包括:
COMMENT 'string'SQL SECURITY DEFINERSQL SECURITY INVOKER
调用用户自定义函数
创建完成后,可以像调用内建函数一样在查询中使用:
SELECT hello('world');
SELECT add_one(41);查看用户自定义函数
可以通过以下语句查看函数元信息和定义:
SHOW FUNCTION STATUS LIKE 'add_one';
SHOW CREATE FUNCTION add_one;修改用户自定义函数
ALTER FUNCTION 用于修改函数特征,例如 SQL SECURITY
和 COMMENT:
ALTER FUNCTION add_one
SQL SECURITY DEFINER
COMMENT 'updated function';删除用户自定义函数
不再使用时,可以删除函数:
DROP FUNCTION IF EXISTS add_one;Loadable UDF
使用 CREATE FUNCTION ... SONAME 可以注册共享库函数。例如:
CREATE FUNCTION my_func RETURNS STRING SONAME 'my_func.so';共享库文件需要放置在 plugin_dir 指定的目录中。Loadable UDF
当前支持 INTEGER、REAL、DECIMAL 和 STRING 返回类型。
风险与不兼容项
tidb_enable_procedure为全局变量,关闭后已有的不带SONAME的函数也无法执行。