文章目录
- 前言
- 一、mysql函数是什么?
- 二、创建函数
- 1.基本语法
- 2.仿照这个写一个自己的函数
- 总结
前言
mysql函数 与存储过程的区别:
- 参数:存储过程对待参数有三种方式:输入(IN),输出(OUT)和输入并输出(INOUT),因为有三种方式所以必须对参数指明其用途;对于存储函数只有一种方式:输入参数,因此不需要写IN;
- 函数有一个returns type(注意这里的return后加上s),存储过程没有也不需要这个返回语句。另外需要说明的是,returns只能对function做指定,对函数而言这是强制的,它用来指定函数的返回类型,因此函数体内必须包含一个return值,即一句return的代码
- 调用存储过程使用call,调用存储函数可以直接使用select查看函数返回值,也可以作为其它函数的参数
一、mysql函数是什么?
示例:now() concat() substar()…这都是内置函数,今天说下我们自定义的函数;
二、创建函数
1.基本语法
参考这篇 文章 主要内容:
DELIMITER $$
DROP FUNCTION IF EXISTS genPerson$$
CREATE FUNCTION genPerson(name varchar(20)) RETURNS varchar(50)
BEGIN
DECLARE str VARCHAR(50) DEFAULT '';
SET @tableName=name;
SET str=CONCAT('create table ', @tableName,'(id int, name varchar(20));');
return str;
END $$
DELIMITER ;
解释如下:
(1)DELIMITER $$ 定义结束符。MySQL默认的结束符是分号,但是函数体中可能用到分号。为了避免冲突,需要另外定义结束符。
(2)DROP FUNCTION IF EXISTS genPerson$$ 如果函数genPerson已经存在了,就删除掉。
(3)CREATE FUNCTION 创建函数genPerson,函数的参数是name,返回值是varchar(50)。
(4)函数体放在BEGIN 与 END之间。
(5)DECLARE 声明变量,str类型是varchar(50),默认值是空。
(6)CONCAT连接多个字符串。
(7)RETURN 返回拼接后的字符串str。
1
由于我们需要用mysql中的 分号 ; 作为一句话的结束,而作为声明函数也是需要有分隔符作为结束的,所以就有了 $$ 这个符号声明下,然后最后再恢复为mysql 的默认 分隔符 ;2
READS SQL DATA 为读取数据库数据,与之相对应的
MODIFIES SQL DATA 这表明例程包含可能写入数据的语句(例如,它包含UPDATE,INSERT,DELETE或ALTER指令)。
NO SQL 这表示例程不包含SQL语句。
CONTAINS SQL 这表示该例程包含SQL指令,但不包含读取或写入数据的语句。
2.仿照这个写一个自己的函数
我想实现一个函数层面的迭代子集查询:
例如这样的数据,是一个类似菜单的属性结构,当用到级联删除的时候,就需要查子集,然后一起处理;
DELIMITER $$
DROP FUNCTION IF EXISTS `get_childern`$$
CREATE FUNCTION `get_childern`(param VARCHAR(55)) RETURNS TEXT CHARSET utf8
READS SQL DATA
BEGIN
DECLARE tem LONGTEXT DEFAULT '';
DECLARE res LONGTEXT DEFAULT '';
SET tem = param;
WHILE tem IS NOT NULL
DO
SET res = CONCAT(res,',',tem);
SELECT GROUP_CONCAT(id) INTO tem FROM auth_menu WHERE FIND_IN_SET(menu_pid,tem);
END WHILE;
RETURN SUBSTR(res,2);
END$$
DELIMITER ;
大致思路如下:
1 tem 为每次的临时变量 res 为最终结果集
2 res需要每次查到当前的子集,然后不断拼接,最终返回全部结果
3 GROUP_CONCAT(id) INTO tem 每次通过 FIND_IN_SET 函数 查找当前的子集,然后放入tem中 ,作为下次的查找子集的入参;
调用该函数,就得到了他的迭代子集包括他自己:
总结
通过此次函数编写,对于mysql函数的编写有了大体的认识,其实也是一个结构化的东西,语法比较固定
DELIMITER $$
DROP FUNCTION IF EXISTS genPerson$$
CREATE FUNCTION genPerson(name varchar(20)) RETURNS varchar(50)
BEGIN
*****
END $$
DELIMITER ;
其中 ***** 的位置为主要的函数逻辑实现,其他可以照着搬过去,改改就好了