用户自定义函数(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 DEFINER
  • SQL SECURITY INVOKER

调用用户自定义函数

创建完成后,可以像调用内建函数一样在查询中使用:

SELECT hello('world'); SELECT add_one(41);

查看用户自定义函数

可以通过以下语句查看函数元信息和定义:

SHOW FUNCTION STATUS LIKE 'add_one'; SHOW CREATE FUNCTION add_one;

修改用户自定义函数

ALTER FUNCTION 用于修改函数特征,例如 SQL SECURITYCOMMENT

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 ... 当前版本尚未支持。

相关文档