欢迎光临qy球友会的网站!公司简介 | 联系我们

某某工厂-专业生产加工、定做各种金属工艺品

国内金属工艺品加工专业厂家
全国服务电话 全国服务电话 401-133-4525
新闻资讯
联系我们
全国服务电话:401-133-4525

传真:+86-193-7867

手机:138 0035 046

邮箱:gwxdn.com

地址:浙江省杭州市

当前位置: 主页 > 新闻资讯 > 公司新闻
mysql函数创建
发布时间:2024-02-12 11:05 来源:[db:来源]

文章目录


前言

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 ;

其中 ***** 的位置为主要的函数逻辑实现,其他可以照着搬过去,改改就好了