存储函数显示出和存储过程很强的相似性:它们都是由sql和过程式语句所组成的代码片段,存储在目录之中,并且可以从应用程序和sql语句调用。然而,它们也有一些区别:
a.存储函数本身就是输出参数。
b.创建了存储函数以后,所有的各种表达式都可以和调用熟悉的标量函数一样的方式来调用存储函数。因此,我们不能使用一个CALL语句调用存储函数。
c.存储函数必须包含一条RETURN语句。这条特殊的的sql语句不允许用于存储过程中。
d.一个函数只能有输入参数,所以无法指定IN,OUT和INOUT。RETURNS声明跟在参数后面并表明了存储函数返回值的数据类型。
2.1 创建语法如下
create function 函数名 (参数列表)
returns 返回值类型
begin
任意系列的sql语句;
return 返回值;
end;
2.2 例如:计算两个数之和
delimiter //
create function functionAdd (a int, b int)
returns int
begin
declare c int;
if a is null then
set a = 0;
end if;
if b is null then
set b = 0;
end if;
set c = a + b;
return(select c as sum);
end; //
delimiter ;
说明:存储函数在returns后面指定了一个整形数据类型,使用这条特殊的语句我们给存储函数一个值。
每个存储函数至少包含1条returns语句。
sql语句可用于存储函数中,return语句可以包含复杂表达式。
2.3 注意: 由括号包围的参数列必须总是存在。如果没有参数,也该使用一个空参数列()。每个参数默认都是一个IN参数,只能是输入参数,不能为OUT或者INOUT类型(与存储过程不同)
在mysql客户端定义存储函数的时候使用delimiter命令来把语句定界符从;变为//,创建完之后在将分隔符更改为;号。
查看数据库中所有存储的存储函数基本信息,包括所属数据库,存储过程名称,创建时间等。
show function status \G
或者
select name from mysql.proc where db = 'your_db_name' and type = 'FUNCTION';
查看某个已存在的存储函数的详细信息(其中functionAdd为以创建的存储函数名)
进入创建该函数的数据库,然后查看
use your_db_name;
show create function functionAdd;
4.1 基本语法
调用一个存储函数与调用MySQL标量函数如substr及cos等没什么明显区别。
4.2 例如
mysql> select functionAdd(1,2) as sum;
+------+
| sum |
+------+
| 3 |
+------+
或者
mysql> set @a = 1;
mysql> set @b = 2;
mysql> select functionAdd(@a,@b) as sum;
+------+
| sum |
+------+
| 3 |
+------+
注意:在使用SET定义变量时应遵循SET的语法规则 SET @变量名=初始值;
5.1 基本语法
ALTER FUCTION 存储函数名 [characteristic ...] 注意:characteristic是存储函数创建时的特征,只要设定了其中的值,存储函数的特征就随之变化,可以使用alter来修改存储函数的特征。
如果要修改存储函数的内容,可以使用先删除再重新定义存储函数的方法。存储函数某些的特征如下
characteristic:
COMMENT 'string'
| LANGUAGE SQL
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
5.2 例如:特征修改
查看默认特征值
mysql> SELECT SPECIFIC_NAME,SQL_DATA_ACCESS, ROUTINE_COMMENT FROM information_schema.Routines WHERE ROUTINE_NAME='functionAdd';
+---------------+-----------------+-----------------+
| SPECIFIC_NAME | SQL_DATA_ACCESS | ROUTINE_COMMENT |
+---------------+-----------------+-----------------+
| functionAdd | CONTAINS SQL | |
+---------------+-----------------+-----------------+ 将读写权限改为READS SQL DATA,并加上注释信息'This is a test!',代码执行如下:
mysql> ALTER FUNCTION functionAdd READS SQL DATA COMMENT 'This is a test!'; 查看修改后的特征值
mysql> SELECT SPECIFIC_NAME,SQL_DATA_ACCESS, ROUTINE_COMMENT FROM information_schema.Routines WHERE ROUTINE_NAME='functionAdd';
+---------------+-----------------+-----------------+
| SPECIFIC_NAME | SQL_DATA_ACCESS | ROUTINE_COMMENT |
+---------------+-----------------+-----------------+
| functionAdd | READS SQL DATA | This is a test! |
+---------------+-----------------+-----------------+ 说明:从查询的结果可以看出,访问数据的权限(SQL_DATA_ACCESS)已经变成READS SQL DATA,函数注释(ROUTINE_COMMENT)已经变成了"This is a test!"。
6.1 基本语法
DROP FUNCTION IF EXISTS 存储函数名
6.2 例如
DROP FUNCTION IF EXISTS functionAdd;
注意:存储函数可以调用存储过程。
**********************************************************************************************
转载请注明出处:http://www.voidcn.com/article/p-tnjdsdns-mp.html **********************************************************************************************