用户自定义函数(UDF)
概述
本文档主要介绍平凯数据库中的用户自定义函数(CREATE FUNCTION)。
这类函数与存储过程共用执行框架,创建后通过普通 SQL 表达式调用。
对于 MySQL 中基于共享库的 loadable UDF
分支,即 CREATE FUNCTION ... SONAME ...
和 CREATE AGGREGATE FUNCTION ... 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;
可装载的用户自定义函数说明(SONAME )
平凯数据库当前版本不支持 MySQL loadable UDF 分支。 执行以下语句时:
CREATE FUNCTION myfunc RETURNS INTEGER SONAME 'myfunc.so';
CREATE AGGREGATE FUNCTION myagg RETURNS REAL SONAME 'myagg.so';
会返回类似如下错误:
ERROR 1235 (42000): This version of TiDB doesn't yet support
'CREATE FUNCTION ... SONAME'
风险与不兼容项
tidb_enable_procedure为全局变量,关闭后已有函数也无法执行。CREATE FUNCTION ... SONAME ...和CREATE AGGREGATE FUNCTION ... SONAME ...当前版本尚未支持。