MySQL中的存储函数与存储过程不同的是,存储函数有一个返回值,可以在SELECT语句中调用,存储函数用于简化复杂的计算过程:shell> vi function.sql;
DROP FUNCTION IF EXISTS get_sal_level;
DELIMITER $$
CREATE FUNCTION get_sal_level(emp int) RETURNS
VARCHAR(10)
DETERMINISTIC
BEGIN
DECLARE sal_level varchar(10);
DECLARE avg_sal FLOAT;
SELECT AVG(salary) INTO avg_sal FROM salaries WHERE
emp_no=emp;
IF avg_sal < 50000 THEN
SET sal_level = 'BRONZE';
ELSEIF (avg_sal >= 50000 AND avg_sal < 70000) THEN
SET sal_level = 'SILVER';
ELSEIF (avg_sal >= 70000 AND avg_sal < 90000) THEN
SET sal_level = 'GOLD';
ELSEIF (avg_sal >= 90000) THEN
SET sal_level = 'PLATINUM';
ELSE
SET sal_level = 'NOT FOUND';
END IF;
RETURN (sal_level);
END
$$
DELIMITER ;
创建函数:mysql> SOURCE function.sql;
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.01 sec)
函数的调用,你需要传入一个参数:#You have to pass the employee number and the function returns the income level.
mysql> SELECT get_sal_level(10002);
+----------------------+
| get_sal_level(10002) |
+----------------------+
| SILVER |
+----------------------+
1 row in set (0.00 sec)
mysql> SELECT get_sal_level(10001);
+----------------------+
| get_sal_level(10001) |
+----------------------+
| GOLD |
+----------------------+
1 row in set (0.00 sec)
mysql> SELECT get_sal_level(1);
+------------------+
| get_sal_level(1) |
+------------------+
| NOT FOUND |
+------------------+
1 row in set (0.00 sec)
列出数据库中的函数可以使用:
SHOW FUNCTION STATUS\G
查看某个已创建的函数,可以使用:
SHOW CREATE FUNCTION \G
注意:
在创建函数的语句后面加上 DETERMINISTIC 关键字是非常重要的。如果一个存储例程序被考虑为deterministic,那么针对相同的输入的参数,这个例程总是会返回相同的结果,而not deterministic 正好相反。黙认是not deterministic,如果要声明 deterministic 则需要显示的指定。
将 NON DETERMINISTIC 例程声明为 DETERMINISTIC 可能会导致意外结果,导致优化器选择错误的计划。 将 DETERMINISTIC 例程声明为 NON DETERMINISTIC 可能会导致优化无法使用,从而降低性能。