MariaDB 教程

数据库和表

MariaDB操作符

MariaDB高级部分

MariaDB函数


MariaDB 函数是一个存储的程序,用于将参数传递给它们并获取函数的返回值。

我们可以在 MariaDB 中创建和删除函数。

1. MariaDB 创建函数

可以在 MariaDB 中创建自己的函数:

语法:

CREATE   
[ DEFINER = { CURRENT_USER | user_name } ]   
FUNCTION function_name [ (parameter datatype [, parameter datatype]) ]  
RETURNS return_datatype [ LANGUAGE SQL  
| DETERMINISTIC  
| NOT DETERMINISTIC  
| { CONTAINS SQL   
| NO SQL  
| READS SQL DATA  
| MODIFIES SQL DATA }  
| SQL SECURITY { DEFINER | INVOKER }  
| COMMENT 'comment_value'  
BEGIN  
   declaration_section  
   executable_section  
END;

1. 创建函数

在 MariaDB 数据库中创建一个函数CalcValue。参考下面代码 -

DELIMITER //
CREATE FUNCTION CalcValue ( starting_value INT )
RETURNS INT DETERMINISTIC
BEGIN
   DECLARE total_value INT;
   SET total_value = 0;
   label1: WHILE total_value <= 3000 DO
     SET total_value = total_value + starting_value;
   END WHILE label1;
   RETURN total_value;
END; //
DELIMITER ;

参数说明

  • DEFINER 子句:它是一个可选的子句。如果没有指定,定义者是创建函数的用户。如果您希望指定不同的定义者,则必须包含DEFINER子句,其中user_name是该函数的定义者。
  • function_name:指定要在 MariaDB 中分配给此函数的名称。
  • return_datatype:它指定函数返回值的数据类型。
  • LANGUAGE SQL:语法为可移植语法,但不会影响函数。
  • DETERMINISTIC:表示该函数将总是返回给定一组输入参数的一个结果。
  • NOT DETERMINISTIC:表示给定一组输入参数,该函数可能会返回不同的结果。结果可能受到表数据,随机数字或服务器变量的影响。
  • CONTAINS SQL:这是默认的。这是一个告知 MariaDB 该函数包含 SQL 的信息性子句,但数据库不验证为真。
  • NO SQL:没有使用的信息性子句将不会影响函数。
  • READS SQL DATA:一个告知 MariaDB 该函数将使用SELECT语句读取数据但不修改任何数据的信息性子句。
  • MODIFIES SQL DATA:一个告知 MariaDB 该函数将使用INSERTUPDATEDELETE或其他 DDL 语句修改 SQL 数据的信息性子句。
  • declaration_section:声明局部变量的函数的地方。
  • executable_section:在函数中输入函数代码的地方。

2. 调用函数

可以看到程序成功执行并创建了一个新的函数。现在可以调用这个新创建的函数了,如下所示:

3. 删除函数

要删除 MariaDB 数据库中的自定义函数很容易。比如要上我们上面创建的函数,请参考以下语法。

语法:

DROP FUNCTION [ IF EXISTS ] function_name;

参数说明

  • function_name:它指定想要删除的函数的名字。

示例:

在上面,我们已经创建了一个名为“CalcValue”的函数。假设现在要删除这个函数,可通过以下语句 -

DROP FUNCTION CalcValue;

现在,可以看到该函数已被删除,不再出现在左侧列表中。

或通过查询下面语句 -

MariaDB [testdb]> SELECT *, EVENT_SCHEMA AS `Db`, EVENT_NAME AS `Name` FROM information_schema.`EVENTS` WHERE `EVENT_SCHEMA`='testdb';
Empty set (0.01 sec)