PingKai Logo下载

用户自定义函数(UDF)

概述

平凯数据库支持以下两类用户自定义函数:

  • 不带 SONAMECREATE 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 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;

Loadable UDF

使用 CREATE FUNCTION ... SONAME 可以注册共享库函数。例如:

CREATE FUNCTION my_func RETURNS STRING SONAME 'my_func.so';

共享库文件需要放置在 plugin_dir 指定的目录中。Loadable UDF 当前支持 INTEGERREALDECIMALSTRING 返回类型。

风险与不兼容项

  • tidb_enable_procedure 为全局变量,关闭后已有的不带 SONAME 的函数也无法执行。

相关文档