MySQL - 存储函数



MySQL 存储函数

存储函数是一组执行特定操作并返回单个值的 SQL 语句。类似于 MySQL 中的内置函数,存储函数可以在任何 MySQL 语句中调用。MySQL 的CREATE FUNCTION语句用于创建存储函数和用户定义函数。

默认情况下,存储函数与默认数据库关联。为了使用 CREATE FUNCTION 语句,用户必须具有 CREATE ROUTINE 数据库权限。

语法

以下是创建新存储函数的语法:

CREATE FUNCTION function_name( parameters... ) RETURN datatype [characteristics] func_body;

其中,

  • function_name:它是我们正在创建的函数的名称。名称不能与 MySQL 内置函数名称相同。

  • parameters:这些是函数的所有参数列表。默认情况下,所有参数都是 IN 参数。我们不能为参数指定 IN、OUT 或 INOUT 修饰符。

  • datatype:这是函数返回值的数据类型。

  • characteristics:只有在声明中指定了至少一个特性(DETERMINISTIC、NO SQL 或 READS SQL DATA)时,才会接受 CREATE FUNCTION 语句。

  • fun_body:包含在 BEGIN 和 END 命令之间定义函数行为的 MySQL 语句集。

示例

首先,让我们使用以下查询创建一个名为CUSTOMERS的表:

CREATE TABLE CUSTOMERS ( ID INT NOT NULL, NAME VARCHAR (20) NOT NULL, AGE INT NOT NULL, ADDRESS CHAR (25), SALARY DECIMAL (18, 2), PRIMARY KEY(ID) );

在这里,我们将行插入到 CUSTOMERS 表中:

INSERT INTO CUSTOMERS VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00), (2, 'Khilan', 25, 'Delhi', 1500.00), (3, 'Kaushik', 23, 'Kota', 2000.00), (4, 'Chaitali', 25, 'Mumbai', 6500.00), (5, 'Hardik', 27, 'Bhopal', 8500.00), (6, 'Komal', 22, 'Hyderabad', 4500.00), (7, 'Muffy', 24, 'Indore', 10000.00);

表显示如下:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 Kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00

创建函数:

使用以下CREATE FUNCTION查询,我们正在创建一个函数,该函数根据客户的AGE返回客户的出生年份:

DELIMITER $$ CREATE FUNCTION DATE_OF_BIRTH(AGE INT) RETURNS INT DETERMINISTIC BEGIN DECLARE currentdate DATE; SELECT CURDATE() INTO currentdate; RETURN year(currentdate)-AGE; END $$ DELIMITER ;

现在,我们使用以下查询调用 DATE_OF_BIRTH 函数:

SELECT ID, NAME, DATE_OF_BIRTH(AGE) AS 'YEAR_OF_BIRTH' FROM CUSTOMERS;

输出

以上查询的输出如下所示:

ID NAME YEAR_OF_BIRTH
1 Ramesh 1991
2 Khilan 1998
3 Kaushik 2000
4 Chaitali 1998
5 Hardik 1996
6 Komal 2001
7 Muffy 1999

从存储过程中调用存储函数

在 MySQL 中,我们可以从存储过程中调用存储函数。以下语句创建了一个名为StudentDetails()的存储过程,该过程调用DATE_OF_BIRTH()存储函数。

DELIMITER $$ CREATE PROCEDURE CustomerDetails() BEGIN SELECT ID, NAME, DATE_OF_BIRTH(AGE) AS 'YEAR_OF_BIRTH' FROM CUSTOMERS; END $$ DELIMITER ;

在这里,我们使用 CALL 关键字调用 CustomerDetails() 存储过程:

CALL CustomerDetails();

输出

以上查询的输出如下所示:

ID NAME YEAR_OF_BIRTH
1 Ramesh 1991
2 Khilan 1998
3 Kaushik 2000
4 Chaitali 1998
5 Hardik 1996
6 Komal 2001
7 Muffy 1999
广告