MySQL的函数和存储过程很像,都对一组SQL语句进行了封装。
两者区别在于返回值,存储过程可以没有返回也可以有多个返回,而函数有且只有一个返回值。
函数创建
语法
CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型BEGIN 函数体END 结束标记
注意:
1、参数只有两个元素:参数名 参数类型
2、函数体必须要有return语句,如果没有会报错。return在函数体最后,如果不是也不会报错,但没有意义。
3、和存储过程创建一样,函数体创建前也可以使用DELIMITER更改结束标记。
函数调用
和系统提供的函数一样使用select。
select 函数名(参数列表)
实例
使用emp表数据测试。
一、返回emp表的行数
函数不像存储过程有out模式参数,我们可以定义变量接收返回值,并返回。
#函数不需要参数#返回值是数值类型DELIMITER &CREATE FUNCTION f1() RETURNS INTBEGIN DECLARE result int default 0;//定义变量 select count(*) into result from emp; return result;end &
上面写法是定义一个变量来返回,其实SQL还可以直接写在return里面
CREATE FUNCTION f1() RETURNS INTBEGIN return ( select count(*) from emp );end &
调用
mysql> select f1()&+------+| f1() |+------+| 10 |+------+1 row in set (0.03 sec)
结果没问题。
二、有参的函数,根据员工姓名返回部门名称
局部变量的作用域在在BEGIN END中,这次在BEGIN END使用用户变量试试。
#函数有一个参数,员工姓名#返回值部门名称,字符类型CREATE FUNCTION f2(name VARCHAR(20)) RETURNS VARCHAR(20)BEGIN set @result = '';#定义用户变量result select d.deptName into @result #赋值 from emp e,department d where e.deptNo = d.id and e.ename = name; return @result;#返回 end &
注意,返回类型是字符型时,要指定长度,即上例中VARCHAR(20)。
调用:
mysql> select f2('Emma')&+------------+| f2('Emma') |+------------+| deptA |+------------+1 row in set (0.00 sec)
函数查看
在mysql这个库的proc表中,可以看到我们定义的所有的存储过程和函数的信息。
这张表的type列可以区分是存储过程还是函数。
要看某个函数的信息
show create FUNCTION 函数名如:show create FUNCTION f1
函数删除
删除使用drop
drop FUNCTION 函数名
如
mysql> drop function f1&Query OK, 0 rows affected (0.00 sec)
这样就删除成功。
关于函数的整理就到此,了解一下它的创建和使用语法。