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:只有在 CREATE FUNCTION 语句的声明中指定了至少一个特性(DETERMINISTIC、NO SQL 或 READS SQL DATA)时,该语句才会被接受。
fun_body:包含一组 MySQL 语句,用于定义 BEGIN 和 END 命令之间函数的行为。
示例
首先,让我们使用以下查询创建一个名为 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查询,我们将创建一个函数,该函数根据客户的年龄返回其出生年份 -
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 |